有条件地替换数据表R中整个组的值



我有一个简单的数据。表如下

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 在一行中完成这项工作

提前感谢

以下是rleid:的方法

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

最新更新