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

  • 本文关键字:汇总表 距离 dplyr 计算 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

下面是计算两点之间距离的函数(欧式):

> 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)
}

这个函数的输入是列向量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

最新更新