更改 xdf 数据集的列位置

Changing the column positions of an xdf dataset

我想知道是否有办法重新排列 xdf 数据集的列位置。例如,如果我有一个包含 [a],[c],[b] 列的 xdf 数据集,我想将列重新排序为 [a],[b],[c] 而无需创建数据框,重新排序列,并使用 RxImport 或 rxDataFrameToXdf 将其转换回xdf 文件(因为 xdf 文件可能有数百万行,我不想将数据集写入内存)。

我看到的一个可能的解决方案是使用 rxSetVarInfoXdf 函数,它包含有关列位置的信息。

类似于: 交换第 2 列和第 3 列的位置

varInfo <- list(list(position = 2, position = 3), list(position = 3, position = 2))

但这不起作用,因为 position 是一个值,您调用该值是为了引用该列而不是更改它。

您可以在 rxDataStep 中使用 varsToKeep 来重新排序您的列,这会将其全部保存在 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)