0
我有两个数据集,A和B在数据集B中的行之间的距离,基于数据集
我感兴趣的B的每一行多远是A中的每个行(都具有相同的列) 。
由于B的大小,在A和B的堆叠数据集上计算dist()或parDist()并采用子集是不可行的。
更具体地说:假设A是50000行,B是250000.我想要250000行x 50000列来详细说明这些距离。
我忽略的任何解决方案?
我有两个数据集,A和B在数据集B中的行之间的距离,基于数据集
我感兴趣的B的每一行多远是A中的每个行(都具有相同的列) 。
由于B的大小,在A和B的堆叠数据集上计算dist()或parDist()并采用子集是不可行的。
更具体地说:假设A是50000行,B是250000.我想要250000行x 50000列来详细说明这些距离。
我忽略的任何解决方案?
这适用于我一个较小的数据集,应该在你的数据集上工作。它将任务分成块,并计算每行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
你试过了什么代码? – DiskJunky
如果每个条目占用8个字节,那么结果将占用93.1GB。加上计算所需的内存。在'R'通常意味着在三倍或280GB左右。你不能想到一次不需要所有距离的算法吗? –
我只尝试过dist和pardist到目前为止。它使用了大量的RAM,但计算时间优于逐行计算。 – Dylan