2016-12-18 65 views
0

我不知道R语法,但我需要对数据进行简单的计算。我需要计算物体之间的距离(空间)在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 ... 
    .... 

我需要计算cur_slice表中列出的每个对象之间的距离。

试图为使用下一个循环的坐标执行临时数组。

> 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项目...我明白,这不是行,它只是项目...

如何从一个表中读取数据和将它添加到另一个表(用于将来的计算),是否需要使用?

回答

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])) 
    } 
    } 
} 

然而,这是非常糟糕的代码

  1. 它有一个for loop
  2. 它有一个嵌套for loop
  3. rbind()在循环中有一个data.frame是非常耗时的,因为它重新分配整个表每次迭代所需的内存。
+0

非常感谢您的回答。 – twistfire

+0

如何更快地执行此代码?我如何删除嵌套循环和?是否有可能动态地添加数据到数据框但速度够快? :) – twistfire

+0

当然,你可以分享你试图用简单的语言来应用的逻辑吗? – mabdrabo