【问题标题】:Euclidean Distances between rows of two data frames in RR中两个数据帧的行之间的欧几里得距离
【发布时间】:2021-01-23 21:54:43
【问题描述】:

R 中计算欧几里得距离很容易。一个很好的例子可以找到HERE。向量化形式为:

sqrt((known_data[, 1] - unknown_data[, 1])^2 + (known_data[, 2] - unknown_data[, 2])^2)

获取一个数据帧的每一行与另一个数据帧的所有行的欧几里得距离的最快、最有效的方法是什么?来自apply() 家族的特定功能?谢谢!

【问题讨论】:

  • 我假设两个数据框需要有相同的变量?因为否则你无法计算欧几里得距离?

标签: r apply euclidean-distance


【解决方案1】:

也许你可以试试outer + dist 如下所示

outer(
  1:nrow(known_data),
  1:nrow(unknown_data),
  FUN = Vectorize(function(x,y) dist(rbind(known_data[x,],unknown_data[y,])))
)

【讨论】:

  • 我很快就发布了几乎相同的答案!现在不打扰了...+1
【解决方案2】:

如果您愿意,我会在两个数据帧的组合上使用dist() 函数(非常有效),然后删除不需要的距离。示例:

df1 <- iris[1:5, -5]
df2 <- iris[6:10, -5]

all_distances <- dist(rbind(df1, df2))
all_distances <- as.matrix(all_distances)

# remove unneeded distances
all_distances[1:5, 1:5] <- NA
all_distances[6:10, 6:10] <- NA

【讨论】:

  • 适用于小数据的好方法,但对于大数据(尤其是如果一个数据帧非常大),这会浪费大量计算。
  • 同意!不幸的是,我的数据很大,这就是为什么我询问了一些类似apply() 的解决方案。
  • 好吧,我认为任何其他选项都不会为渐近计算工作提供解决方案,当仅计算来自不同数据帧的距离时,这也非常高。如果您的数据如此之大,计算任何距离矩阵都将是一项挑战。
猜你喜欢
  • 2018-05-26
  • 2019-06-19
  • 2019-09-30
  • 1970-01-01
  • 2020-11-11
  • 2014-05-31
  • 2014-06-08
  • 2021-06-22
相关资源
最近更新 更多