【问题标题】:Efficient Combination and Operating on Large Data Frames大数据帧的高效组合和操作
【发布时间】:2015-12-07 13:47:39
【问题描述】:

我在 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, ]), ]。然后我会使用 ikey 找到 myDF1 和 myDF2 的所有组合:

# 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 上执行某种类型的子集。有关如何最有效地完成此任务的任何建议?

谢谢!

【问题讨论】:

    标签: r performance memory-management ff ffbase


    【解决方案1】:

    我很不清楚你打算用 rowSum 和你的 3) 元素做什么,但是如果你想要一个高效且对 RAM 友好的 2 ff 向量组合,要获得所有组合,你可以使用 expand.ffgrid from ffbase。 以下将在几秒钟内生成尺寸为 160Mio 行 x 2 列的 ffdf。

    require(ffbase)
    x <- expand.ffgrid(myDF1$key, myDF2$key)
    

    【讨论】:

    • expand.ffgrid 适用于我正在尝试的内容。我的第三点是这样的:那么引用原始数据集的最有效方法是什么?例如,最初,我的 df 是 Nx2 和 Mx3 尺寸。然后我添加了键,所以它们变成了 Nx3 和 Mx4 尺寸。您的解决方案x &lt;- expand.ffgrid(myDF1$key, myDF2$key) 给了我一个 (N * M) x 2 ffdf。然后我如何最有效地将其扩展为 (N * M) x (3 + 4) 维度 ffdf?也就是说,使用 x 对象中的组合键,我想引用/扩展原始数据。
    • 使用合并将您的其他数据合并到 (NxM) 扩展网格上。参见 ffbase 包的 ?merge.ffdf
    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 2011-07-23
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多