【问题标题】:Assigning NA to groups of variables using data.table使用 data.table 将 NA 分配给变量组
【发布时间】:2012-12-06 01:45:31
【问题描述】:

我正在尝试使用 data.table 将特定值(0 和 99)的 NA 分配给一组变量(9 个变量,从 p05_1 到 p05_9)。我没有收到任何错误,但是当我使用此代码时没有任何反应:

这里是一个简短的例子:

v_1  <- c(0,0,1,2,3,4,4,99)
v_2  <- c(1,2,2,2,3,99,1,0)
dat  <-  data.table(v_1,v_2)

for(n in 1:9) {
  char <- sprintf('p05_%s', n)
  st[eval(parse(text=char)) %in% c(0,99), eval(parse(text=char)) := NA_integer_]
}

最好的。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这与this question and answer有关

    要让data.table 开始使用eval in j 模式,整个调用应该是eval(...)。

    否则,你的调用被解析为

    `:=`(eval(parse(text=char)), NA_integer_)
    

    [.data.table我正在尝试在 j 中使用 eval 不会被选中。 我还没有测试过i,但无论如何这样做是安全的

    类似

    for(n in 1:2) {
      chari <-  paste0(sprintf('v_%s' ,n), ' %in% c(0,99)')
      charj <- sprintf('v_%s := NA_integer_', n)
      dat[eval(parse(text=chari)), eval(parse(text=charj))]
    }
    

    应该可以。注意我已经捏造了对%in% 的调用,以避免sprintf 使用% 作为常规字符时出错。

    【讨论】:

    • 谢谢,我在使用 sprintf 时遇到了 %in% 的问题...:参数太少
    【解决方案2】:

    eval(parse(text= 路由的替代方案,在这种情况下:

    for (n in 1:2) {
        vnam = paste0("v_",n)
        set(dat, which(dat[[vnam]]%in%c(0,99)), vnam, NA_integer_)
    }
    

    请注意,基本 R 中的 [[ 不会复制列(它是写时复制),因此这是引用单个列的好方法。如果有很多列(比如 10,000+),循环 set[[ 可能是值得的。

    【讨论】:

      【解决方案3】:

      下面是另一种使用 replace() 函数的方法:

      > dat[, lapply(list(v_1, v_2), function(x) replace(x, x %in% c(0, 99), NA_integer_))]
         V1 V2
      1: NA  1
      2: NA  2
      3:  1  2
      4:  2  2
      5:  3  3
      6:  4 NA
      7:  4  1
      8: NA NA
      

      【讨论】:

      • 不过,那是那些列的副本。它不分配。它并没有真正回答问题。 @sdaza 当你接受它时你意识到了吗?
      猜你喜欢
      • 1970-01-01
      • 2016-12-12
      • 2021-01-03
      • 2021-04-16
      • 2023-03-04
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多