我有一个表,包括用户,序列和地理位置:x和y
我想按用户对其进行分组,并根据序列计算总距离
例如:
> df <- data.frame(user_id=rep(1,3), seq=1:3, x=c(1,5,3), y=c(2,3,9))
> df
user_id seq x y
1 1 1 1 2
2 1 2 5 3
3 1 3 3 9
这是计算两点之间距离的函数(Euclidean):
> d <- function(n1,n2){
+ d <- sqrt((df$y[n2]-df$y[n1])^2+(df$x[n2]-df$x[n1])^2)
+ return(d)
+ }
我想得到这样的总距离:
> df <- data.frame(user_id=1, dtot=d(1,2)+d(2,3))
> df
user_id dtot
1 1 10.45
如何使用dplyr“group_by”并根据所有用户的顺序获取总距离?
答案 0 :(得分:1)
实现目标的一种方法是定义计算总距离的函数:
library(dplyr)
total.dist <- function(x,y) {
sum(sqrt((x-lag(x))^2+(y-lag(y))^2),na.rm=TRUE)
}
此函数的输入是列向量x
和y
。我们通过用这些列的lag
减去,以矢量化方式计算每一行之间的距离。然后总距离是计算的所有距离的sum
,移除NA
s。
然后将其用作summarise
函数group_by
user_id
:
res <- df %>% group_by(user_id) %>% summarise(dtot=total.dist(x,y))
### A tibble: 1 x 2
## user_id dtot
## <dbl> <dbl>
##1 1 10.44766