2016-08-16 2 views
0

私は、指定された期間 "dateperiod"で発生したGPSの場所を使用しています。私は1つの行(dateperiod)の値を使用して、その日付期間の列を調べ、作業中の行の値(外乱までの距離)を抽出したいと思います。しかし、私はループ内でこれをやっています複数の外乱データフレーム。ダミーデータセット:data.tableを使用して、複数のdata.framesのループ内の値と一致する名前の列から値を抽出する

例の基本データ(data_basic_DT):

structure(list(EndId = 1:9, dateperiod = c(141101L, 141101L, 
141101L, 141101L, 141101L, 141101L, 141101L, 141101L, 141101L 
)), .Names = c("EndId", "dateperiod"), row.names = c(NA, -9L), class = "data.frame") 

例外乱データ1(low_roads):

structure(list(EndId = 1:9, dateperiod = c(141101L, 141101L, 
141101L, 141101L, 141101L, 141101L, 141101L, 141101L, 141101L 
), `151101` = c(710.211, 684.471, 676.831, 762.955, 704.06, 674.685, 
682.495, 686.586, 696.348), `150501` = c(710.211, 684.471, 676.831, 
762.955, 704.06, 674.685, 682.495, 686.586, 696.348), `141101` = c(710.211, 
684.471, 676.831, 762.955, 704.06, 674.685, 682.495, 686.586, 
696.348), `140501` = c(710.211, 684.471, 676.831, 762.955, 704.06, 
674.685, 682.495, 686.586, 696.348), `131101` = c(710.211, 684.471, 
676.831, 762.955, 704.06, 674.685, 682.495, 686.586, 696.348), 
    `130501` = c(710.211, 684.471, 676.831, 762.955, 704.06, 
    674.685, 682.495, 686.586, 696.348), `121101` = c(710.211, 
    684.471, 676.831, 762.955, 704.06, 674.685, 682.495, 686.586, 
    696.348)), .Names = c("EndId", "dateperiod", "151101", "150501", 
"141101", "140501", "131101", "130501", "121101"), row.names = c(NA, 
-9L), class = "data.frame") 

例外乱データ2(high_roads):

structure(list(EndId = 1:9, dateperiod = c(141101L, 141101L, 
141101L, 141101L, 141101L, 141101L, 141101L, 141101L, 141101L 
), `151101` = c(806.415, 802.56, 502.35, 1234.2, 704.06, 685.23, 
682.495, 1002.3, 696.348), `150501` = c(710.211, 684.471, 676.831, 
762.955, 704.06, 802.56, 502.35, 1234.2, 696.348), `141101` = c(710.211, 
130.25, 453.25, 762.955, 704.06, 674.685, 682.495, 686.586, 696.348 
), `140501` = c(710.211, 684.471, 802.56, 502.35, 1234.2, 674.685, 
682.495, 686.586, 696.348), `131101` = c(710.211, 684.471, 676.831, 
762.955, 704.06, 674.685, 502.35, 1234.2, 704.06), `130501` = c(710.211, 
684.471, 676.831, 762.955, 704.06, 674.685, 682.495, 686.586, 
696.348), `121101` = c(502.35, 1234.2, 704.06, 762.955, 704.06, 
674.685, 682.495, 686.586, 696.348)), .Names = c("EndId", "dateperiod", 
"151101", "150501", "141101", "140501", "131101", "130501", "121101" 
), row.names = c(NA, -9L), class = c("data.table", "data.frame" 
), .internal.selfref = <pointer: 0x0000000006640788>) 

したがって、EndIdごとに、dateperiodを調べて、この例では141101であることを確認してください列 "141101"にookを入力し、値を抽出して新しい列に入れます。 low_roadsとhigh_roadsを通るループの中で。今

disturbancelist <- list(low_roads=low_roads, high_roads=high_roads) #Lists all the disturbance dataframes 
for (d in disturbancelist){ 
    ##Create a column named by the current disturbance class 
    Class<-d$Class[2] ##calls the disturbance type 
    ##Merge basic data and each disturbance dateframe to get the right distance values 
    mergeex<-merge(data_basic_DT, d, by.x = "EndId", by.y = "EndId", all.y == FALSE) 
    mergeexdf<-as.data.frame(mergeex) 
    col.names<-names(mergeexdf) 
    mergeexdf$distance <- mergeexdf[cbind(1:nrow(mergeexdf), fmatch(mergeexdf$dateperiod, col.names))] 
    names(data_basic_DT)[names(data_basic_DT)=="distance"] <- Class ##Change name of column to current disturbance class 
    print(Class) 
} 

は、私はそれを実行するためにdata.tablesで動作するようにこのコードを変更したいと思います:いくつかの助け(下記)、私はこれで、それが以前よりもずっと速く作業を持っているに

感謝もっと早く。これは、ループの外側でdata.tablesとして動作しますが、内部では動作しません。どんな助けにも感謝!

+2

この投稿は長すぎますし、私には再現性がありませんが、私は(ブライアンの答えに基づいて)これは関連していると思います:http://stackoverflow.com/questions/33310179/select-values-from-異なる列を持つ変数を含む列名 – Frank

+0

人がコピー&ペーストできる形式でサンプルデータを提供する必要があります(データのサブセットで正しい形式を得るには 'dput 'を使用します)。投稿タブ/スペース区切りテーブルは誰にも役立ちません。実際にサンプルコードを実行するために定義されていない変数を参照するサンプルコードを投稿することもできません。 –

+0

ありがとう、私は質問をより鮮明に、簡潔に(うまくいけば)編集し、再現可能な例を提供しました。注:以下の回答に基づいて更新しました。 – Mel

答えて

0

私はあなたのことを正しく理解していれば、私はしばらく前に質問したように聞こえます。 R data.frame get value from variable which is selected by another variable, vectorizedその質問は一般的にdata.framesに適用されますが、私はそれがまだdata.tableのための良い解決策だと思います。編集:応答に基づいていないかもしれませんが、少なくともdata.framesでうまく動作します。

names属性でmatch属性を使用して、各行の列の数値インデックスを取得し、それを使用して値を取得することです。 df呼ばdata.frameのためにこのような何か、:

最初の数 1:nrow(df)は基本的にあなたの forループの起こりと第二の数 match(df$dateperiod, names(df))は、名前ごとに、 dateperiodに含まれる値と一致する列を識別し
df$newvar <- df[cbind(1:nrow(df), match(df$dateperiod, names(df)))] 

行。 matchは列ベクトルdf$dateperiod全体を操作し、同じ長さの列を戻すために機能します。

希望に役立ちます。

+2

data.tableを持っている場合は、そのパッケージが提供する高速結合を使用したいが、比較的遅い(比較して)基本関数の一致は使用しないでください。 – Roland

+0

ありがとうございます、私はそれをdataframesで素早くうまく動作させましたが、data.tablesではできませんでした。ルーピング中に異なるdata.tablesを呼び出すときには、名前(dt)が壊れてしまいます。私はこの改善を反映するために質問を編集しました。 – Mel

関連する問題