我在 R 中有 2 个相对较大的数据框。我正在尝试尽可能高效地合并/查找所有组合。结果 df 变得很大(长度为dim(myDF1)[1]*dim(myDF2)[1]
),因此我尝试使用ff
. 我也愿意使用其他解决方案,例如bigmemory
解决这些内存问题的包。我对这些软件包中的任何一个几乎都没有经验。
工作示例 - 假设我正在使用一些类似于 USArrests 的数据框:
library('ff')
library('ffbase')
myNames <- USArrests
myNames$States <- rownames(myNames)
rownames(myNames) <- NULL
现在,我将制作 2 个数据框,它们代表来自 myNames 的一些特定观察集。稍后我将尝试通过它们的行名来引用它们。
myDF1 <- as.ffdf(as.data.frame(matrix(as.integer(rownames(myNames))[floor(runif(3*1e5, 1, 50))], ncol = 3)))
myDF2 <- as.ffdf(as.data.frame(matrix(as.integer(rownames(myNames))[floor(runif(2*1e5, 1, 50))], ncol = 2)))
# unique combos:
myDF1 <- unique(myDF1)
myDF2 <- unique(myDF2)
例如,我在 myDF1 中的第一组状态是myNames[unlist(myDF1[1, ]), ]
. 然后我将使用以下命令找到 myDF1 和 myDF2 的所有组合ikey
:
# create keys:
myDF1$key <- ikey(myDF1)
myDF2$key <- ikey(myDF2)
startTime <- Sys.time()
# Create some huge vectors:
myVector1 <- ffrep.int(myDF1$key, dim(myDF2)[1])
myVector2 <- ffrep.int(myDF2$key, dim(myDF1)[1])
# This takes about 25 seconds on my machine:
print(Sys.time() - startTime)
# Sort one DF (to later combine with the other):
myVector2 <- ffsorted(myVector2)
# Sorting takes an additional 2.5 minutes:
print(Sys.time() - startTime)
1)有没有更快的方法来排序?
# finally, find all combinations:
myDF <- as.ffdf(myVector1, myVector2)
# Very fast:
print(Sys.time() - startTime)
2) 这种组合是否有替代方案(不使用 RAM)?
最后,我希望能够按行/列引用任何原始数据。具体来说,我想获得不同类型的 rowSums。例如:
# Here are the row numbers (from myNames) for the top 6 sets of States:
this <- cbind(myDF1[myDF[1:6,1], -4], myDF2[myDF[1:6,2], -3])
this
# Then, the original data for the first set of States is:
myNames[unlist(this[1,]),]
# Suppose I want to get the sum of the Urban Population for every row, such as the first:
sum(myNames[unlist(this[1,]),]$UrbanPop)
3)最终,我想要一个带有上述 rowSum 的向量,所以我可以在myDF
. 关于如何最有效地做到这一点的任何建议?
谢谢!