首页 > 解决方案 > 根据列中的信号填充值

问题描述

在下面的数据中,我想在每个 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")),) 来定位正确的列并将它们替换为所需的输出,但我还没有找到函数部分的正确语法的嬗变。我正在尝试使用 cumsum() 通过每一列携带值,但是当我尝试根据 z.out 翻转回来时,我只会遇到错误。

谢谢您的帮助!

标签: r

解决方案


一种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

推荐阅读