r - 根据列中的信号填充值
问题描述
在下面的数据中,我想在每个 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 翻转回来时,我只会遇到错误。
谢谢您的帮助!
解决方案
一种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
推荐阅读
- roku - 有没有办法将键盘与标签相关联?
- python - 将请求响应添加到 Pandas Dataframe 中的单独行
- python - Eror exucting script with python 3.5 but working fine with 3.8
- python - “BertTokenizerFast”对象没有属性“get_vocab_size”
- python - “球”对象没有属性“身体”
- python - 具有复合主键的 Django 模型未更新
- php - 我想检查两个表是否所有内容都相似
- azure - 如何在 Azure ML 工作室设计器管道中使用模块?
- nuxt.js - 我如何从生产中阻止页面但在 nuxt 的开发中显示?
- sql - 无法识别日期“% {syslog_timestamp}”