按组处理数据:仅删除dummy变量值为1的重复行,保留所有值为0的行
按组处理数据:仅删除dummy变量值为1的重复行,保留所有值为0的行
嘿,别担心,第一次提问完全没问题的!我来帮你搞定这个数据处理的需求~
你的核心需求我get到了:按国家分组、按年份排序后,所有event为0的行全部保留,而event为1的行只保留每组里的第一个,之后出现的1都要删掉。
先说说你之前代码的问题:你用slice(if(1 %in% event) seq(match(1, event)) else row_number())的逻辑是取到第一个1所在的位置为止的所有行,这样会把第一个1之后的所有行(包括event为0的行)都删掉,这显然不符合你想要保留后续0的需求。
那我们换个思路,直接过滤出符合条件的行就可以了,用dplyr的写法如下:
df %>% arrange(country, year) %>% # 先按国家、年份排序,保证时间顺序正确 group_by(country) %>% # 按国家分组处理 filter( # 条件:要么是event为0,要么是该组第一个出现的event为1的行 event == 0 | (event == 1 & row_number() == match(1, event)) ) %>% ungroup() # 取消分组
我给你解释下这段代码的关键部分:
match(1, event)会返回当前组里第一个event等于1的行号- 结合
row_number() == match(1, event),就能精准定位到每组的第一个1 - 再加上
event == 0的条件,就保证了所有0的行都被保留
举个小例子验证下效果:假设某组数据是这样的:
| country | year | event |
|---|---|---|
| A | 1920 | 0 |
| A | 1921 | 0 |
| A | 1922 | 1 |
| A | 1923 | 1 |
| A | 1924 | 0 |
| A | 1925 | 1 |
处理后会保留1920、1921、1922、1924这几行,删掉1923和1925的行,完全符合你的要求。
备注:内容来源于stack exchange,提问作者RodrigoLins
相关产品推荐
相关产品推荐

