如何使用doParallel软件包将列添加到数据框列表中的每个元素

时间:2019-01-23 12:57:07

标签: r doparallel geosphere

我在R中有一个数据框列表。每个数据框包含成千上万条记录。在每个数据框中,我想添加新列,并且该列的值将由同一数据框的其他列计算。我正在使用2个嵌套的for循环来执行此操作,但是这需要很长时间。 我想通过doParallel包和foreach函数使用并行计算。

列表的每个数据框包含3列,即纬度,经度和Received_time。 我要遍历列表中的每个数据框,然后添加2列作为distance_difference和time_diff。 distance_difference将包含两个对应的Lat,Long对之间的反正弦距离,并且time_diff将包含Received_time的相应读数之间的时间差。

for(i in 1:length(file_list)){
  file_list[[i]]$distance_difference=0
  file_list[[i]]$time_diff=0
  for(j in 1:nrow(file_list[[i]])){
file_list[[i]]$distance_difference[j-1]=distm(c(file_list[[i]][j,2], file_list[[i]][j,1]), c(file_list[[i]][j-1,2], file_list[[i]][j-1,1]), fun = distHaversine)
file_list[[i]]$time_diff[j-1]=difftime(file_list[[i]]$received_at[j], 
          file_list[[i]]$received_at[j-1], units = "secs")
 }
 print(i)
 }

原始数据框:

    lat     long         received_at   
1 23.09818 72.63290 2018-12-01 06:38:38
2 23.09818 72.63290 2018-12-01 06:38:40 
3 23.09818 72.63290 2018-12-01 06:38:40 
4 23.09879 72.63232 2018-12-01 06:39:35
5 23.09854 72.63052 2018-12-01 06:40:07 
6 23.09830 72.62988 2018-12-01 06:40:31

预期结果:

  lat     long         received_at        distance_difference time_diff
1 23.09818 72.63290 2018-12-01 06:38:38                   0         2
2 23.09818 72.63290 2018-12-01 06:38:40                   0         0
3 23.09818 72.63290 2018-12-01 06:38:40                  90        55
4 23.09879 72.63232 2018-12-01 06:39:35                 186        32
5 23.09854 72.63052 2018-12-01 06:40:07                  69        24
6 23.09830 72.62988 2018-12-01 06:40:31                1386       124

这是列表中单个数据框的头部。我想快速进行计算。我能想到的是doParallel和foreach的用法,但是如果还有其他修改可以快速计算出该值,请告诉我。谢谢

列表中的总记录约为12000万(所有数据帧的所有记录的总和),因此我必须计算12000万条记录的正弦距离和时差。

0 个答案:

没有答案