首页 > 解决方案 > 按组求和总距离

问题描述

我每小时都有一个 df 跟踪点的移动。我想通过添加每小时坐标之间的距离来找到该组/试验的总距离,但我对应用函数感到困惑。

我想说“在每个组/试验中,总和 [distance(hour1-hou2), distance(hour2=hour3), distance(hour3-hour4)....] 直到当前时间,所以在每一行,我都有一个累积行驶距离值。

我在下面创建了一个假 df。

 paths <- data.frame(matrix(nrow=80,ncol=5))
 colnames(paths) <- c("trt","trial","hour","X","Y")
 paths$trt <- rep(c("A","B","C","D"),each=20)
 paths$trial <- rep(c(rep(1,times=10),rep(2,times=10)),times=4)
 paths$hour <- rep(1:10,times=8)
 paths[,4:5] <- runif(160,0,50)

 #this shows the paths that I want to measure.
 ggplot(data=paths,aes(x=X,y=Y,group=interaction(trt,trial),color=trt))+
   geom_path()

我可能想添加一列paths$dist.traveled来跟踪每小时。

我想我可以使用apply或者甚至可以使用,aggregate但我一直在使用PointDistance来查找距离,所以我有点困惑。我也不想在循环中做一个循环,因为真正的数据集很大。

标签: rpathapplydistance

解决方案


这是一个使用的答案{dplyr}

library(dplyr)
paths %>% 
    arrange(trt, trial, hour) %>% 
    group_by(trt, trial) %>% 
    mutate(dist_travelled = sqrt((X - lag(X))^2 + (Y - lag(Y))^2)) %>% 
    mutate(total_dist = sum(dist_travelled, na.rm = TRUE)) %>% 
    ungroup()

如果您想要总距离但仅按trt而不是分组,trial您只需将其从调用中删除即可group_by()


推荐阅读