繁体   English   中英

如何使用dist()函数计算组内的成对距离

[英]How to use dist() function to calculate pairwise distances within groups

我正在尝试计算特定人员的总行驶距离,但是我不确定如何为dist()函数指定该距离,这样我就可以获得个人的距离,而不是每个人的距离总和(例如John +詹姆斯+鲍勃+ ...的)。 数据看起来像这样(但更大)

Name    x    y
John    12  34
John    15  31
John    8   38
John    20  14
John    12  35
Bob     2   15
Bob     2   18
James   30  21
James   30  28
James   29  32
...

我当前的代码是:

dist(rbind(data$x,data$y), method = "euclidean"). 

我已经尝试过使用{}和其他方法尽可能地将if(data$name == "John")代码放进去,但是没有,但是它们似乎都给了我一个错误。 谁能帮我吗?

使用dplyr包,您可以将dist函数应用于name dplyr每个子集。 解决方案基于此处找到的答案。

library(dplyr)
data = data.frame(name = c(rep('John',5), rep('Steve', 5), rep('Dave', 5)), x=sample(1:10,15), y=sample(1:10,15))
distout = data %>% group_by(name) %>% summarise(distmatrix=dist(rbind(x, y), method = "euclidean"))

如果您正在计算行进距离,那么我认为您需要连续坐标之间的距离。 您可以使用proxy软件包提供的dist函数,该函数比默认软件包灵活一些,并将其与dplyr结合使用:

library(proxy)
library(dplyr)

df <- data.frame(Name = c(rep("John", 5L), rep("Steve", 5L), rep("Dave", 5L)), 
                 x = sample(1:30, 15L),
                 y = sample(1:30, 15L))

group_fun <- function(sub_df) {
    if (nrow(sub_df) == 1L)
        return(data.frame(Name = sub_df$Name, total = 0))

    x <- sub_df[-nrow(sub_df), c("x", "y")]
    y <- sub_df[-1L, c("x", "y")]
    total <- sum(proxy::dist(x, y, method = "Euclidean", pairwise = TRUE))
    # return
    data.frame(Name = sub_df$Name[1L], total = total)
}

out <- df %>%
    group_by(Name) %>%
    do(group_fun(.))

group_fun内部, x包含除最后一个坐标外的所有坐标, y包含除第一个坐标外的所有坐标(在两种情况下均为每组),因此x[i,]y[i,]包含任何i连续坐标。 因此,当我们使用pairwise = TRUE调用proxy::dist时,我们现在获得了每对之间的距离(逐行)。

在返回的数据框中,我们使用sub_df$Name[1L]因为Name是一个分组变量,因此sub_df所有行的Name都必须相同,并且在摘要中只需要其值之一。

而且,如果您想变得更紧凑,则可以不使用dist (即仅使用dplyr )来做到这dplyr

out <- df %>%
    group_by(Name) %>%
    summarise(total = sum(sqrt((x - lag(x))^2 + (y - lag(y))^2), na.rm = TRUE))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM