我有一个简单的数据。表如下
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)]