2

对于 Revolution R Enterprise 用户,有没有办法将函数应用于 .xdf 的因子级别,例如rxCube()?我知道转换可以让你对数据预制表进行操作,但在我看来你只能得到 ( count, sum, mean)。

例如,我想找到具有特定变量最小值的行,条件是industry * year.

我能想到的唯一解决方案是rxSplit()数据,按你想要的变量排序,然后做你想做的事。我确信不能这样做的原因是完整性条件太多/支持的制表函数实际上是在 C 中优化的,使用自己的函数会更加复杂和非常慢。

基本上有一个内存不足的data.table会很棒。

4

1 回答 1

3

您所描述的内容通过 RevoScaleR 的单个功能并不容易实现。你所描述的rxSplit是一种方式。在这里,将结果与aggregate内存中的结果进行比较,以表明它们是相同的。

set.seed(1234)
myData <- data.frame(year = factor(sample(2000:2015, size = 100, replace = TRUE)),
                     x = rnorm(100))
xdfFile <- rxDataStep(inData = myData, outFile = "test.xdf", rowsPerRead = 10)

newDir <- file.path(getwd(), "splits")
dir.create(newDir)
splitFiles <- rxSplit(inData = xdfFile, 
                      outFilesBase = paste0(newDir, "/", gsub(".xdf", "",
                                            basename(xdfFile@file))), 
                      splitByFactor = "year")

minFun <- function(xdf) {
  dat <- rxDataStep(inData = xdf, reportProgress = 0)
  data.frame(year = dat$year[1], minPos = which.min(dat$x))
}
minPos <- do.call(rbind, lapply(splitFiles, minFun))
row.names(minPos) <- NULL

minPos
aggregate(x ~ year, data = myData, FUN = which.min

上面确实假设每组中的数据都可以放入 RAM。如果不是这种情况,则需要进行一些调整。

假设各个组可以放入 RAM,还有另一种解决方案,那就是使用RevoPemaR包。

library("RevoPemaR")

rxSort(inData = xdfFile, outFile = xdfFile, sortByVars = "year", overwrite = TRUE)

byGroupPemaObj <- PemaByGroup()
minByYear <- pemaCompute(pemaObj = byGroupPemaObj, data = xdfFile, 
                       groupByVar = "year", computeVars = "x", 
                       fnList = list(
                         minPos = list(FUN = which.min, x = NULL)))

minPos
于 2015-02-12T21:46:43.863 回答