我有一个由用户、序列和地理位置组成的表: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
下面是计算两点之间距离的函数(欧式):
> 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"并根据所有用户的序列获得总距离?
实现这一目标的一种方法是定义一个计算总距离的函数:
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