数据集B中的行之间的距离,基于数据集A.

时间:2017-10-11 10:17:34

标签: r

我有两个数据集,A和B

我感兴趣的是B的每一行到A的每一行的距离(两者都有相同的列)。

由于B的大小,在A和B的堆叠数据集上计算dist()或parDist()并取一个子集是不可行的。

更具体地说:假设A是50000行,B是250000.我想要250000行x 50000列来详细说明这些距离。

我忽视的任何解决方案?

1 个答案:

答案 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