【问题标题】:Conditionally replace value of entire group in data.table R有条件地替换data.table R中整个组的值
【发布时间】:2021-01-05 17:13:06
【问题描述】:

我有如下简单的data.table

structure(list(A = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 1L, 1L, 1L, 1L, 1L), 
    B = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0)), class = c("data.table", "data.frame"), row.names = c(NA, 
-41L), .internal.selfref = <pointer: 0x561c95850b70>)

看起来像-

   A  B
 1: 4  0
 2: 4  0
 3: 4  0
 4: 4  0
 5: 4  0
 6: 4  0
 7: 4  0
 8: 2  0
 9: 2  0
10: 2  0
11: 1  0
12: 1  0
13: 1 -1
14: 1  0
15: 1  0
16: 1  0
17: 1  0
18: 1  0
19: 1  0
20: 1  0
21: 1  0
22: 1  0
23: 1  0
24: 1  0
25: 1  0
26: 1  0
27: 1  0
28: 1  0
29: 1  0
30: 3  0
31: 3  0
32: 3  0
33: 3  0
34: 3  0
35: 4  0
36: 4  0
37: 1  0
38: 1  0
39: 1  0
40: 1  0
41: 1  0

在 A 列中,仅当 B 列中的任何值不为 0 时,我才想将整个组的值替换为值 1 到 6。

这是期望的结果 -

   A  B
 1: 4  0
 2: 4  0
 3: 4  0
 4: 4  0
 5: 4  0
 6: 4  0
 7: 4  0
 8: 2  0
 9: 2  0
10: 2  0
11: 6  0
12: 6  0
13: 6 -1
14: 6  0
15: 6  0
16: 6  0
17: 6  0
18: 6  0
19: 6  0
20: 6  0
21: 6  0
22: 6  0
23: 6  0
24: 6  0
25: 6  0
26: 6  0
27: 6  0
28: 6  0
29: 6  0
30: 3  0
31: 3  0
32: 3  0
33: 3  0
34: 3  0
35: 4  0
36: 4  0
37: 1  0
38: 1  0
39: 1  0
40: 1  0
41: 1  0

我尝试了很多方法来使用 data.table 来解决这个问题,但似乎没有任何效果。以下只是更改所有 1 组的值,这是不正确的。

t[, A := ifelse(any(B != 0 & A == 1), 6, A), by = A]

应该有一种简单而简洁的方法可以使用 data.table 在一行中完成此操作

提前致谢

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这是rleid 的一种方法:

    data[,.(A = fifelse(rep(any(B!=0),.N) & A == 1, 6 , A), B), by = rleid(A)][,.(A,B)]
    

    【讨论】:

      猜你喜欢
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2020-02-10
      • 2021-08-21
      • 2021-10-15
      相关资源
      最近更新 更多