在大型数据框架上高效组合和运行

时间:2015-09-11 05:21:01

标签: r performance memory-management ff ffbase

我在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的一些特定的观察结果。我将在稍后尝试通过他们的rownames引用它们。

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上执行某种类型的子集。关于如何最有效地实现这一目标的任何建议?

谢谢!

0 个答案:

没有答案