我想知道是否有办法重新排序xdf数据集的列位置。例如,如果我有一个 xdf 数据集,其列 [,a],[,c],[,b] ,我想将列重新排序为 [,a],[,b],[,c] ,无需创建数据帧,重新排序列,并使用RxImport或rxDataFrameToXdf将其转换回xdf文件(因为xdf文件可能具有数百万行,我不想将数据集写入内存。
我看到的一个可能的解决方案是使用 rxSetVarInfoXdf 函数,该函数包含有关列位置的信息。
像: 第2列和第3列的交换位置
varInfo <- list(list(position = 2, position = 3), list(position = 3, position = 2))
但是这不起作用,因为position是一个值,你调用它来引用列而不是更改它。
答案 0 :(得分:1)
您可以使用varsToKeep
中的rxDataStep
对您的列进行重新排序,从而将所有列保留在XDF中。我并不完全确定这一点,但我相信这一切都发生在C ++中 - 所以它应该相对较快。
# First, set up pointers to the source XDF file
sourcePath <- file.path(rxGetOption("sampleDataDir"), "mortDefaultSmall.xdf")
# Look at the top several rows
rxDataStep(sourcePath, numRows = 10)
# Create a new path for the reordered dataset
reorderPath <- paste0(tempfile(), ".xdf")
# If you've got a lot of columns and only want to move one, you probably
# don't want to type them all out. Try this instead:
varNames <- names(rxGetVarInfo(sourcePath))
varToMove <- "creditScore"
otherVars <- varNames[!varNames %in% varToMove]
# Reorder them using varsToKeep - just put varToMove at the end
rxDataStep(inData = sourcePath,
outFile = reorderPath,
varsToKeep = c(otherVars, varToMove),
overwrite = TRUE
)
# Check that the order has changed
rxDataStep(reorderPath, numRows = 10)