如何在R语言dataframe分组后为每组首行赋值c=0?
解决分组后仅修改每组第一行c值的问题
嗨,我明白你的需求啦——你想保留所有数据行,只把group_by(a,b)后每组的第一行c列设为0,而原来的代码用了filter,会把非第一行的记录过滤掉,所以行数变少了,这确实不符合预期。
这里有两种简单的方法可以实现你的需求,都能完整保留所有数据行:
方法一:使用ifelse
df1 %>% group_by(a, b) %>% mutate(c = ifelse(row_number() == 1, 0, c)) %>% ungroup()
方法二:使用case_when(更易读,适合多条件场景)
df1 %>% group_by(a, b) %>% mutate(c = case_when( row_number() == 1 ~ 0, TRUE ~ c # 其他行保留原c值 )) %>% ungroup()
原理说明:
row_number()在分组后会为每组内的行从1开始编号,第一行就是row_number() == 1;mutate是对原数据框进行列修改,不会删除任何行,完美解决你之前丢失数据的问题;- 最后加
ungroup()是个好习惯,避免后续操作不小心继承分组状态。
用你的示例数据测试的话,运行后会得到你想要的结果:
# A tibble: 4 × 3 a b c <chr><chr><dbl> 1 a1 b1 0 2 a1 b1 NA 3 a2 b2 0 4 a2 b2 NA
内容的提问来源于stack exchange,提问作者Satyaki Dasgupta
相关产品推荐
相关产品推荐

