【问题标题】:R How to replace elements of a group only when all elements are zeroR仅当所有元素都为零时如何替换组的元素
【发布时间】:2021-06-16 01:16:19
【问题描述】:

我有 data.table dt,我想在组中的所有元素都为零时添加一个新列 new_col

library(data.table)
a <- c(1, 2, 3, 0, 0, 0, 0, 1)
group <- c("a", "a", "a", "b", "b", "c", "c", "c")
dt = data.table(a, group)
dt[]
   a group
1: 1     a
2: 2     a
3: 3     a
4: 0     b
5: 0     b
6: 0     c
7: 0     c
8: 1     c

以下是我绑定的代码。

dt[, new_col := ifelse(all(a == 0), NA, a), by = group]
dt[]

我得到的输出是

   a group new_col
1: 1     a       1
2: 2     a       1
3: 3     a       1
4: 0     b      NA
5: 0     b      NA
6: 0     c       0
7: 0     c       0
8: 1     c       0

预期的输出是

   a group new_col
1: 1     a       1
2: 2     a       2
3: 3     a       3
4: 0     b      NA
5: 0     b      NA
6: 0     c       0
7: 0     c       0
8: 1     c       1

谁能指出我做错了什么?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这里,我们可以使用if/else,因为ifelse要求所有参数的长度相同all(a == 0)的长度为1,以及'yes'但'no'的长度不是1,这会导致回收

    dt[, new_col := if(all(a == 0)) NA else a, by = group]
    

    -输出

    dt
       a group new_col
    1: 1     a       1
    2: 2     a       2
    3: 3     a       3
    4: 0     b      NA
    5: 0     b      NA
    6: 0     c       0
    7: 0     c       0
    8: 1     c       1
    

    或者也可以使用.I 来获取否定表达式的行索引(或使用any),提取($V1)并将这些元素从'a'分配给new_col。默认情况下,其他元素将为 NA

    dt[dt[, .I[!all(a == 0)], group]$V1, new_col := a]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多