【发布时间】: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