2016-12-18 11 views
0

R構文ではわかりませんが、データを使って簡単な計算を行う必要があります。私はcur_sliceテーブルにリストされた各オブジェクト間の距離を計算する必要がRのループとデータセットの列と値の追加

str(cur_slice) 
    Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 489 obs. of 24   variables: 
    $ MMSI  : num 2.73e+08 2.11e+08 2.72e+08 2.73e+08 2.73e+08 ... 
    $ LATITUDE : num 45.4 44.1 46.9 44.7 45.2 ... 
    $ LONGITUDE : num 36.7 28.6 32 37.8 36.5 ... 
    .... 

(空間)オブジェクト間の距離を計算する必要があります。

次のループを使用して座標の一時配列を試行しています。

> myarray <- NULL # Creates empty storage container 
    > for (row in seq(cur_slice)) { 
     cur_MMSI<- cur_slice$MMSI[raw] 
     cur_lon<-cur_slice$LONGITUDE[raw] 
     cur_lat<-cur_slice$LATITUDE[raw] 
     for (raw2 in seq(cur_slice)) { 
      if(!cur_slice$MMSI[raw2]==cur_MMSI) { 
       myarray<-c(myarray, cur_MMSI, cur_slice$MMSI[raw2], cur_lat, cur_lon, cur_slice$LATITUDE[raw2], cur_slice$LONGITUDE[raw2]) 
      } 
     } 
    } 

しかし:

  1. 私は、テーブル内のデータを得ることはありません(myarrayのは、単純なリストです)。リストではなくテーブルを取得するにはどうすればよいですか?
  2. 私の全体の配列が大きすぎます。例えば。サンプルのcur_sliceには489個のオブジェクトがあります。全体の配列には31962456個のアイテムがあります:31962456アイテム...行ではなく、アイテムだけです...

1つのテーブルからデータを読み取る方法それを別のテーブルに追加して(将来の計算用に)使用する必要がありますか?

答えて

1

これは、コードを編集してループからテーブルを外す方法です。

mydf <- data.frame() # Creates empty dataframe 
for (row in seq(cur_slice)) { 
    cur_MMSI<- cur_slice$MMSI[raw] 
    cur_lon<-cur_slice$LONGITUDE[raw] 
    cur_lat<-cur_slice$LATITUDE[raw] 
    for (raw2 in seq(cur_slice)) { 
    if(!cur_slice$MMSI[raw2]==cur_MMSI) { 
     mydf<-rbind(mydf, data.frame(cur_MMSI, cur_slice$MMSI[raw2], cur_lat, cur_lon, cur_slice$LATITUDE[raw2], cur_slice$LONGITUDE[raw2])) 
    } 
    } 
} 

しかしこれは、ループ内data.frameにネストされたfor loop

  • rbind()持ってfor loop
  • ので、非常に時間がかかるはずだ

    1. 極端に悪いコードにあります各繰り返しごとにテーブル全体に必要なメモリを再割り当てします。
  • +0

    あなたの答えに感謝します。 – twistfire

    +0

    このコードをもっと速くするにはどうしたらいいですか?どのように入れ子になったループを削除することができますか?データフレームに動的にデータを追加することは可能ですが、十分に速いのですか? :) – twistfire

    +0

    確かに、単純な言葉で適用しようとしているロジックを共有できますか? – mabdrabo

    関連する問題