亡八の覚書

環境分野の化学分析屋(見習い)が、独学でたどる解析の冥府魔道

後方流跡線をRで描いてみる

オフラインで得た後方流跡線のテキストデータ。

これまではExcelマクロ&GMTで描いていたけど

様々な処理をRにまとめたくて

Rで描くことに挑戦。

 

で、まず最初に戸惑ったのがデータの読み込み。

今まではExcelで読み込んでいたから問題なかったけど

Rで行ごとに項目数が異なるデータを読み込むことが

簡単ではなかったので、その覚書。

 

つまりは、read.tabel()では、読み込めませんでした。
 
なので、readLines()で読み込みます。
ただし、これだと1行が一つの文字列として読み込まれるので
それぞれの数字を、ばらばらにしないといけない。
 
そこで使ったのがunlist(strsplit(data[i]," "))
空白を区切りとして、それぞれの行を個別の文字に認識。
 
しかし、ここでまた問題が。
なんと、各文字間の空白の数が、ばらばらだったのです。
つまり、
1□□□□□1
1□□□□ - 1
1□□□ 1 2 5
 
のように、後ろの数が大きくなると間の空白の数が変わるのです。
(なんて気の利いた設定だこと・・・・・・)
 
そうなると、空白を区切り文字にすると
各要素へのアクセスをするときに
ある行は、目的の数字がdata[48]だったとしても
別の行では、同じ緯度なりがdata[59]だったりするわけで
目的の要素にアクセスできるとは、限らなくなるわけで。
行ごとに、指定する数が変わってきてしまう!
 
なんとか空白の要素だけを取り除きたいけどis.na()とかを使っても
空白はチェックを通ってしまう。
 
なので一工夫。
要素を数字に変換して、1で割ってやると
数字はそのまま、空白はNAになるのですよ!!
で、このNAを除けば、数字だけが残るという仕組み。
 
つまり、後方流跡線のファイルをsampldata.txtとすると
 
data <- readLines("sampledata.txt")
i <- 11 #これは一例。目的の行数を入れる
lat <- na.omit(as.numeric(unlist(strsplit(data[11]," ")))/1)[9]
lon <-na.omit(as.numeric(unlist(strsplit(data[11]," ")))/1)[10]
height <- na.omit(as.numeric(unlist(strsplit(data[11]," ")))/1)[11]
 
data2 <- c(lat, lon, height)
 
これで、緯度・経度・高度のベクトルが得られるね!