通过 Revolution R 聚合 .xdf
Aggregating .xdf via Revolution R
对于 Revolution R Enterprise 用户,有没有办法将函数应用于 .xdf 的因子级别,例如 rxCube()
?我知道 transforms 让你对数据 pre 制表进行操作,但在我看来你只能得到 (count
, sum
, mean
) .
例如,我想找到具有特定变量最小值的行,条件是 industry * year
。
我能想到的唯一解决方案是rxSplit()
数据,按你想要的变量排序,然后做你想做的事。我确信不能这样做的原因是完整性条件太多/支持的制表函数实际上在 C 中进行了优化,使用您自己的函数会更加复杂且速度非常慢。
基本上内存不足就太棒了data.table。
使用 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
对于 Revolution R Enterprise 用户,有没有办法将函数应用于 .xdf 的因子级别,例如 rxCube()
?我知道 transforms 让你对数据 pre 制表进行操作,但在我看来你只能得到 (count
, sum
, mean
) .
例如,我想找到具有特定变量最小值的行,条件是 industry * year
。
我能想到的唯一解决方案是rxSplit()
数据,按你想要的变量排序,然后做你想做的事。我确信不能这样做的原因是完整性条件太多/支持的制表函数实际上在 C 中进行了优化,使用您自己的函数会更加复杂且速度非常慢。
基本上内存不足就太棒了data.table。
使用 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