我试图计算图上第一个点和所有其他点之间的欧氏距离。我不能用dplyr
做这个。但是代码似乎在我使用for loop
时运行。我想知道解决这个问题的矢量化方法是什么。
样本代码:
set.seed(5)
#create data
df <- data.frame("x" = runif(100, 0, 1)) %>%
mutate(y = log(x)) %>%
arrange(x)
#Function takes two tuples consisting of coordinate data and returns the euclidian distance between the points
euc_dist = function(a, b) {
return(sqrt(sum(a - b) ^ 2))
}
我试着在数据框上运行这个。首先,我认为一种方法行不通:
df %>%
mutate(dist = euc_dist(c(x[1], y[1]),
c(x, y)))
生成一个具有常量值的变量dist
,而不是为每一行生成一个值。所以我尝试了一些我认为可行的方法,但那有点麻烦。
df %>%
mutate(dist = euc_dist(c(df$x[1], df$y[1]),
c(x, y)))
这产生与上述相同的结果。
我想要的是这样的等价物:
output <- c()
for (i in 1:nrow(df)) {
out <- euc_dist(c(df$x[1], df$y[1]),
c(df$x[i], df$y[i]))
output <- append(output, out)
}
这很好。
有没有一种方法可以通过矢量化的方法来实现这一点,最好是在dplyr
中?
1条答案
按热度按时间ldxq2e6h1#
在
euc_dist
函数中,我会替换sum()
,因为它是对所有值求和,而不是逐行求和。因为你想保持
(x1, y1)
不变,所以在调用这个函数时需要显式。完整的解决方案是
注意,现在
dist
列对x
列没有意义。因此,您可能需要考虑x
是否实际上有意义。如果没有,可以将第一个(x, y)
对作为常量放入函数中。