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

  • 本文关键字:距离 计算 dist 何使用 函数 r
  • 更新时间 :
  • 英文 :


我正在尝试计算特定人员行驶的总距离,但我不确定如何为 dist(( 函数指定它,以便我将得到个人的距离,而不是每个人的距离都相加(例如约翰 + 詹姆斯 + 鲍勃 +...(。数据看起来像这样(但要大得多(

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"){} 的代码,而不是什么,但它们似乎都给了我一个错误。谁能帮我?

如果您正在计算行驶距离, 那么我认为您需要连续坐标之间的距离。 您可以使用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_funx包含除最后一个坐标之外的所有坐标, 并且y包含除第一个坐标之外的所有坐标 (两种情况下每组(, 所以x[i,]y[i,]包含任何i的连续坐标。 因此,当我们用pairwise = TRUE称呼proxy::dist时, 我们现在得到每对之间的距离(按行(。

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

如果你想更紧凑一点,你可以在没有dist的情况下做到这一点 (即仅使用dplyr(:

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

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

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

最新更新