我有两个数据集,A和B
我感兴趣的是B的每一行到A的每一行的距离(两者都有相同的列)。
由于B的大小,在A和B的堆叠数据集上计算dist()或parDist()并取一个子集是不可行的。
更具体地说:假设A是50000行,B是250000.我想要250000行x 50000列来详细说明这些距离。
我忽视的任何解决方案?
答案 0 :(得分:0)
这对我来说适用于较小的数据集,应该适用于您的数据集。它将任务分成块,并计算每行A与B的所有行的摘要统计。它仍然执行一个全面的比较,因为它遍历所有行的A。 (如果这不是您正在寻找的,那么提供可重现的示例和预期的输出以避免这样的情况非常重要)
set.seed(1)
A <- as.data.frame(matrix(runif(500*2)*10, nrow=500)) # change 500 to 50000
B <- as.data.frame(matrix(runif(250000*2)*10, nrow=250000))
myfun <- function(rowsofA, B) {
Dx <- outer(rowsofA[,1], B[,1], "-")**2 # ** is same as ^
Dy <- outer(rowsofA[,2], B[,2], "-")**2
Dist <- sqrt(Dx+Dy) # Dist = sqrt((x1-x2)^2 + (y1-y2)^2)
# add summary stat below
Summ <- data.frame( mean = apply(Dist, 1, mean),
sd = apply(Dist, 1, sd),
min = apply(Dist, 1, min),
max = apply(Dist, 1, max))
return(Summ)
}
library(purrr)
map_df(split(A, 1:5), ~myfun(.x, B))
对于500行数据集,split(..., 1:5)
会将数据帧拆分为5个100行数据帧。使用50,000行数据集时,请根据您的记忆使用split(..., 1:100)
或split(..., 1:1000)
之类的内容。
使用500行数据集输出。输出的每一行为每行A对比所有行的B提供mean, sd, min, and max
距离。
# mean sd min max
# 1 4.332120 1.922412 0.0104518694 9.179429
# 2 6.841677 2.798114 0.0044511643 13.195127
# 3 5.708658 2.601969 0.0131417242 11.788345
# 4 4.670345 2.139370 0.0104878996 9.521932
# 5 6.249670 2.716091 0.0069813098 12.473525
# 6 5.497154 2.476391 0.0127143548 11.108188
# 7 3.928659 1.551248 0.0077266976 7.954166
# etc