使用R中的dplyr计算和汇总表中的总距离

时间:2016-10-25 10:17:19

标签: r dplyr

我有一个表,包括用户,序列和地理位置: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”并根据所有用户的顺序获取总距离?

1 个答案:

答案 0 :(得分:1)

实现目标的一种方法是定义计算总距离的函数:

library(dplyr)
total.dist <- function(x,y) {
  sum(sqrt((x-lag(x))^2+(y-lag(y))^2),na.rm=TRUE)
}

此函数的输入是列向量xy。我们通过用这些列的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