我每小时都有一个df跟踪点的运动。我想通过添加小时坐标之间的距离来找到该组/审讯所经过的总距离,但是我将自己与应用函数混淆了。
我想说“在每组/试验中,将[距离(hour1-hou2),距离(hour2 = hour3),距离(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
来查找距离,所以我有点困惑。我也不想在循环内进行循环,因为实际数据集很大。
答案 0 :(得分:3)
以下是使用{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()
的呼叫中删除。
答案 1 :(得分:1)
这是您要实现的目标吗?:
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.
我正在添加新列以计算每个组的距离,并将它们相加。