【问题标题】:Aggregating .xdf via Revolution R通过 Revolution R 聚合 .xdf
【发布时间】:2015-02-12 16:11:16
【问题描述】:

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

例如,我想查找具有特定变量最小值的行,以industry * year 为条件。

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

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

【问题讨论】:

    标签: r revolution-r


    【解决方案1】:

    使用 RevoScaleR 的单个功能不容易实现您所描述的内容。你用rxSplit 描述的是一种方式。这里将结果与aggregate in-memory 的结果进行比较,以表明它们是相同的。

    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
    

    【讨论】:

    • 这不太一样。找到最小值与找到最小值所在的行不同。从您的代码看来,rxDataStep 的明显问题是它只能在块的范围内评估“minFun”。只有能够通过 rxSummary 崩溃才能得到答案,其中每个块 保证 是您想要的子集。在我看来,唯一的方法是 rxSplit 文件,但我不明白为什么在应用 rxFactors 来评估因子内的块后,Revolution Analytics 不能使用索引。
    • 乍一看,您似乎来自 Revo R 团队。我喜欢你的产品!我只是在建议一些对我来说似乎有意义的事情。
    • @APK,这是有道理的,而且很可能有一天会出现这种情况,但现在你用rxSplit 描述的内容将起作用。我误读了您的问题,因此我将编辑答案以给出您要查找的最小值的行。
    • @APK 这满足你的要求吗?
    • 不知道 RevoPemaR。这是,如果我明白它在做什么,难以置信!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多