在下面的数据中,我想在每个 1 之后递增单元格值,但如果 Z.out = 1,则在下一个单元格将其重置为零。这是一个示例。
起始数据:
Z B_1 C_1 D_1 E_1 F_1
0 0 0 0 0 0
0 1 0 0 1 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
1 0 0 0 0 0
0 0 0 0 0 1
0 1 0 0 0 0
0 0 1 1 0 0
0 0 0 1 0 0
0 1 0 1 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
1 0 0 0 0 0
0 0 0 0 1 0
0 0 0 0 0 0
期望的输出:
Z B_1 C_1 D_1 E_1 F_1
0 0 0 0 0 0
0 1 0 0 1 0
0 1 0 0 1 0
0 1 0 0 1 0
0 1 0 0 1 0
0 1 1 0 1 0
0 1 1 0 1 0
1 1 1 0 1 0
0 0 0 0 0 1
0 1 0 0 0 1
0 1 1 1 0 1
0 1 1 2 0 1
0 2 1 3 0 1
0 2 1 3 0 1
0 2 1 3 0 1
0 2 1 3 0 1
1 2 1 3 0 1
0 0 0 0 1 0
0 0 0 0 1 0
我想我可以使用 df <- df %>% transmute_at(vars(contains("_1")),) 来定位正确的列并将其替换为所需的输出,但我还没有找到正确的语法Transmute 的函数部分。我试图使用 cumsum() 来携带每列中的值,但是当我尝试基于 z.out 向后翻转时,我只会遇到错误。
感谢您的帮助!
最佳答案
一种dplyr
可能是:
df %>%
group_by(grp = cumsum(Z == 0 & lag(Z, default = first(Z)) == 1)) %>%
mutate(across(-Z, cumsum))
Z B_1 C_1 D_1 E_1 F_1 grp
<int> <int> <int> <int> <int> <int> <int>
1 0 0 0 0 0 0 0
2 0 1 0 0 1 0 0
3 0 1 0 0 1 0 0
4 0 1 0 0 1 0 0
5 0 1 0 0 1 0 0
6 0 1 1 0 1 0 0
7 0 1 1 0 1 0 0
8 1 1 1 0 1 0 0
9 0 0 0 0 0 1 1
10 0 1 0 0 0 1 1
11 0 1 1 1 0 1 1
12 0 1 1 2 0 1 1
13 0 2 1 3 0 1 1
14 0 2 1 3 0 1 1
15 0 2 1 3 0 1 1
16 0 2 1 3 0 1 1
17 1 2 1 3 0 1 1
18 0 0 0 0 1 0 2
19 0 0 0 0 1 0 2
关于r - 根据列中的信号填充值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64053508/