我正在尝试计算特定人物的总行进距离,但我不确定如何为dist()函数指定它,这样我就可以获得个人的距离,而不是所有人的距离都总结了(例如John + James + Bob + ......)。数据看起来像这样(但更大)
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")
代码添加到{}而不是什么,但它们似乎都给我一个错误。有人可以帮帮我吗?
答案 0 :(得分:0)
使用dplyr
包,您可以在dist
变量的每个子集上应用name
函数。解决方案基于找到的答案here。
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"))
答案 1 :(得分:0)
如果您正在计算行进距离,
那么我认为你需要连续坐标之间的距离。
您可以使用dist
包提供的proxy
功能,
这比默认的更灵活一点,
并将其与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
的连续坐标。
因此,当我们使用proxy::dist
致电pairwise = TRUE
时,
我们现在得到每对之间的距离(按行)。
在返回的数据框中,我们使用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))