【问题标题】:Sum total distance by groups按组求和总距离
【发布时间】:2019-07-18 22:17:58
【问题描述】:

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

我想说“在每个组/试验中,总和 [距离(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 来查找距离,所以我有点困惑。我也不想在循环中做循环,因为真实的数据集很大。

【问题讨论】:

  • 你想通过试验和 trt 移动还是仅仅 trt?
  • 那么对于每个组(trt 和试验的组合),您想要每小时总距离的总和吗?您能否添加一个示例来说明您的预期结果如何?
  • 还有你的坐标是什么crs?
  • @e.matt 我想按治疗和试验分组。对不起,我应该澄清更多。立即编辑。

标签: r path apply distance


【解决方案1】:

这是一个使用{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() 的调用中删除。

【讨论】:

  • 实际上-我误解了。我希望 distance_traveled 列是累积的,所以我可以说“在第 4 小时,这个粒子总共移动了 x 距离”。我可以为此调整 dist_travelled mutate 行吗?
  • 想通了.. 我正在使用%&gt;% tidyr::replace_na(list(dist_travelled=0)) %&gt;% mutate(total_dist = cumsum(dist_travelled)) %&gt;% ungroup() 谢谢!
【解决方案2】:

这是你想要达到的目标吗?:

paths %>%
  mutate(dist.traveled = sqrt((X-lag(X))^2 + (Y-lag(Y))^2))


   trt   trial  hour      X      Y dist.traveled
   <chr> <dbl> <int>  <dbl>  <dbl>         <dbl>
 1 A         1     1 11.2   26.9           NA   
 2 A         1     2 20.1    1.48          27.0 
 3 A         1     3 30.4    0.601         10.4 
 4 A         1     4 31.1   26.6           26.0 
 5 A         1     5 38.1   30.4            7.88
 6 A         1     6 27.9   47.9           20.2 
 7 A         1     7 16.5   35.3           16.9 
 8 A         1     8  0.328 13.0           27.6 
 9 A         1     9 14.0   41.7           31.8 
10 A         1    10 29.7    7.27          37.8 
# ... with 70 more rows


paths$dist.travelled[which(paths$hour==1)] <- NA

paths %>%
  group_by(trt)%>%
  summarise(total_distance = sum(dist.traveled, na.rm = TRUE))



trt   total_distance
  <chr>          <dbl>
1 A               492.
2 B               508.
3 C               479.
4 D               462.

我正在添加新列来计算每个组的距离,并将它们相加。

【讨论】:

    猜你喜欢
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2018-08-07
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多