【问题标题】:Replace existng column in MSR替换 MSR 中的现有列
【发布时间】:2016-12-15 13:16:55
【问题描述】:

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

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

【问题讨论】:

    标签: microsoft-r


    【解决方案1】:

    目前,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"
    

    【讨论】:

    • RevoScaleR 不允许就地操作现有变量的原因是什么?
    • 我不在工程团队,所以我不能给出明确的答案,但这是出于性能原因。
    【解决方案2】:

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

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

    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 中那些令人讨厌的疣之一)。我认为没有任何方法可以更改现有变量的类型,即使您写入不同的文件。
    • @HongOoi,以前可能是这样,但现在不是。我发帖前测试过。两种解决方案都有效。我将添加一些代码以使其成为一个工作示例。
    • 我得到的结果好坏参半。已发送电子邮件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多