【问题标题】:Add max column using variable使用变量添加最大列
【发布时间】:2018-09-11 21:14:23
【问题描述】:

我正在尝试做与这个问题相同的事情:Add max value to a new column in R,但是,我想直接传入一个变量而不是列名,因此我不会将列名硬编码到公式中。

示例代码:

a <- c(1,1,2,2,3,3)  
b <- c(1,3,5,9,4,NA)
d <- data.table(a, b)
d

a b
1 1
1 3
2 5
2 9
3 4
3 NA

我可以得到这个:

a b max_b
1 1 3
1 3 3
2 5 9
2 9 9
3 4 4
3 NA 4

通过硬编码:setDT(d)[, max_b:= max(b, na.rm = T), a] 但我想做这样的事情:

cn <- "b"
setDT(d)[, paste0("max_", cn):= max(cn, na.rm = T), a]

但是,这不起作用,因为在 max() 内部,它计算为字符而不是列的最大值。它计算出一个名为max_b 的列,其中包含值b,因为max("b") = "b"。我明白为什么会这样,我只是不知道解决方法。

有什么办法解决这个问题?

注意:我标记的上述堆栈问题被标记为重复并已关闭,但我选择了该问题,因为我在我的代码中使用了它接受的答案。我也不是 100% 同意这是一个重复的问题。

【问题讨论】:

    标签: r variables max character


    【解决方案1】:

    试试setDT(d)[, paste0("max_", cn) := eval(parse(text = max(eval(parse(text = cn))))), a]

    # output
       a b max_b
    1: 1 1     3
    2: 1 3     3
    3: 2 5     9
    4: 2 9     9
    5: 3 4     4
    
    # example with missing values
    a <- c(1,1,2,2,3,3)  
    b <- c(1,3,5,9,4,NA)
    d <- data.table(a, b)
    cn <- "b"
    setDT(d)[, paste0("max_", cn) := eval(parse(text = max(eval(parse(text = cn)),
                                                           na.rm = TRUE))), a]
    #output
       a  b max_b
    1: 1  1     3
    2: 1  3     3
    3: 2  5     9
    4: 2  9     9
    5: 3  4     4
    6: 3 NA     4
    

    【讨论】:

    • 如果我想把, na.rm = T打进去怎么办?
    • 您只需将其添加到max() 调用中
    • 我注意到如果我添加另一个只有 NA 值的字段并运行它在其中输入 -INF 而不是 NA 的相同代码,因为我有 na.rm = T 有没有办法离开如果只有NA 值,它是NA,还是应该在之后将-Inf 更改为NA
    • 很难同时使用na.rm = Tna.rm = F。我会使用d[d == -Inf] &lt;- NA 之类的方式选择您的第二个选项
    【解决方案2】:

    一种选择是在.SDcols 中指定变量,然后将函数应用于.SD(Data.table 的子集)。

    d[, paste0("max_", cn) := lapply(.SD, max, na.rm = TRUE), by = a, .SDcols = cn]
    d
    #   a  b max_b
    #1: 1  1     3
    #2: 1  3     3
    #3: 2  5     9
    #4: 2  9     9
    #5: 3  4     4
    #6: 3 NA     4
    

    另一个选项是转换为符号,然后执行evaluation

    d[, paste0("max_", cn) := max(eval(as.symbol(cn)), na.rm = TRUE), by = a]
    

    【讨论】:

      猜你喜欢
      • 2018-09-17
      • 2019-05-23
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多