R:以行对循环遍历data.frame

R:以行对循环遍历data.frame,r,performance,loops,parallel-processing,pairwise,R,Performance,Loops,Parallel Processing,Pairwise,我想两两处理一些GPS数据行 现在,我是在一个普通的For循环中完成的,但我相信有更好更快的方法 n = 100 testdata <- as.data.frame(cbind(runif(n,1,10), runif(n,0,360), runif(n,14,16), runif(n, 46,49))) colnames(testdata) <- c("speed", "heading", "long", "lat") head(testdata) diffmatrix <

我想两两处理一些GPS数据行

现在,我是在一个普通的For循环中完成的,但我相信有更好更快的方法

n = 100
testdata <- as.data.frame(cbind(runif(n,1,10), runif(n,0,360), runif(n,14,16), runif(n, 46,49)))
colnames(testdata) <- c("speed", "heading", "long", "lat")
head(testdata)

diffmatrix <- as.data.frame(matrix(ncol = 3, nrow = dim(testdata)[1] - 1))
colnames(diffmatrix) <- c("distance","heading_diff","speed_diff")

for (i in 1:(dim(testdata)[1] - 1)) {
  diffmatrix[i,1] <- spDists(as.matrix(testdata[i:(i+1),c('long','lat')]),
                             longlat = T, segments = T)*1000
  diffmatrix[i,2] <- testdata[i+1,]$heading - testdata[i,]$heading
  diffmatrix[i,3] <- testdata[i+1,]$speed - testdata[i,]$speed
}
head(diffmatrix)
我如何使用apply函数实现这一点

或者甚至可以并行地进行计算


多谢各位

我不确定您想对结束条件做什么,但是使用dplyr,您可以在不使用for循环的情况下完成所有这些

library(dplyr)
testdata %>% mutate(heading_diff = c(diff(heading),0),
                    speed_diff = c(diff(speed),0), 
                    longdiff =  c(diff(long),0), 
                    latdiff = c(diff(lat),0)) 
         %>% rowwise() 
         %>% mutate(spdist = spDists(cbind(c(long,long + longdiff),c(lat,lat +latdiff)),longlat = T, segments = T)*1000 ) 
         %>% select(heading_diff,speed_diff,distance = spdist)

#   heading_diff speed_diff distance
#          <dbl>      <dbl>    <dbl>
# 1         15.9      0.107   326496
# 2       -345       -4.64     55184
# 3        124       -1.16     25256
# 4         85.6      5.24    221885
# 5         53.1     -2.23     17599
# 6       -184        2.33    225746
我将在下面解释每一部分:

管道操作符%>%本质上是一个链,它将一个操作的结果发送到下一个操作。因此,我们从测试数据开始,将其发送给mutate函数

使用mutate创建4个新列,这些列是从一行到下一行的差异度量。在最后一行添加0,因为在最后一个数据点之后没有测量。可以做一些像NA的事情

下一步,一旦有了要按行使用的差异,就可以对每一行应用spDists函数

最后,我们使用mutate创建另一个列,该列调用我们先前创建的原始4个列


为了只得到您关心的3列,我在末尾使用了select语句。如果需要整个数据帧,您可以省略此项。

我不确定您想对结束条件做什么,但使用dplyr,您可以在不使用for循环的情况下完成所有这些

library(dplyr)
testdata %>% mutate(heading_diff = c(diff(heading),0),
                    speed_diff = c(diff(speed),0), 
                    longdiff =  c(diff(long),0), 
                    latdiff = c(diff(lat),0)) 
         %>% rowwise() 
         %>% mutate(spdist = spDists(cbind(c(long,long + longdiff),c(lat,lat +latdiff)),longlat = T, segments = T)*1000 ) 
         %>% select(heading_diff,speed_diff,distance = spdist)

#   heading_diff speed_diff distance
#          <dbl>      <dbl>    <dbl>
# 1         15.9      0.107   326496
# 2       -345       -4.64     55184
# 3        124       -1.16     25256
# 4         85.6      5.24    221885
# 5         53.1     -2.23     17599
# 6       -184        2.33    225746
我将在下面解释每一部分:

管道操作符%>%本质上是一个链,它将一个操作的结果发送到下一个操作。因此,我们从测试数据开始,将其发送给mutate函数

使用mutate创建4个新列,这些列是从一行到下一行的差异度量。在最后一行添加0,因为在最后一个数据点之后没有测量。可以做一些像NA的事情

下一步,一旦有了要按行使用的差异,就可以对每一行应用spDists函数

最后,我们使用mutate创建另一个列,该列调用我们先前创建的原始4个列


为了只得到您关心的3列,我在末尾使用了select语句。如果您需要整个数据帧,可以省略此项。

非常感谢!您的方法比普通for循环快10倍以上!非常感谢你!您的方法比普通for循环快10倍以上!