替换 MSR 中的现有列

Replace existng column in MSR

为什么下面的 MSR 代码没有替换原来的列 "Var1"?

rxDataStep(inData = input_xdf, outFile = input_xdf, overwrite = TRUE,
       transforms = list(Var1 = as.numeric(Var1)),
       transformVars = c("Var1")
       )

MSR 不允许您用不同的变量类型覆盖原地的变量。

您有两个选择:写入不同的变量或写入不同的文件。我添加了一些代码,表明这两种解决方案都按照 MRS 9.0.1 中所述的方式工作。如评论中所述,在早期版本中有些地方可能不起作用。我不太确定那个点在哪里,所以代码应该让你知道。

input_xdf <- "test.xdf"
modified_xdf <- "test_out.xdf"

xdf_data <- data.frame(Var1 = as.character(1:10),
                       Var2 = 2:11,
                       stringsAsFactors = FALSE)

rxDataStep(inData = xdf_data,
           outFile = input_xdf,
           rowsPerRead = 5,
           overwrite = TRUE)

rxDataStep(inData = input_xdf, 
           outFile = input_xdf, 
           overwrite = TRUE,
           transforms = list(Var1b = as.numeric(Var1)),
           transformVars = c("Var1")
)

rxGetInfo(input_xdf, getVarInfo = TRUE, numRows = 5)

rxDataStep(inData = input_xdf, 
           outFile = modified_xdf,
           transforms = list(Var1 = as.numeric(Var1)),
           transformVars = c("Var1")
)

rxGetInfo(modified_xdf, getVarInfo = TRUE, numRows = 5)

目前,RevoScaleR 不支持更改 xdf 文件中的变量类型(即使您写入不同的文件)。方法是创建一个新变量,删除旧变量,然后将新变量重命名为旧名称。

我建议使用 transformFunc 执行此操作(有关详细信息,请参阅 ?rxTransform),这样您就可以一步创建新变量并删除旧变量:

rxDataStep(inXdf, outXdf, transformFunc=function(varlst) {
    varlst$Var1b <- as.numeric(varlst$Var1)
    varlst$Var1 <- NULL
    varlst
}, transformVars="Var1")

# this is fast as it only modifies the xdf metadata, not the data itself
names(outXdf)[names(outXdf) == "Var1b"] <- "Var1"