如何基于分组内特定行条件为R数据框全组统一赋值新列?
按分组条件为整组统一生成新列的解决方案
问题背景
现有如下data.frame数据:
df = data.frame( ID=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3), Year=c(2010,2011,2012,2013,2014,2010,2011,2012,2013,2014, 2010,2011,2012,2013,2014), Value = c(1,1,0,0,0, 0,1,1,1,1, 1,0,0,0,0) )
需求:按ID分组生成新列NewCol,规则为:
- 若该组内存在
Year == 2012且Value == 0的行,整组NewCol均为0 - 否则整组
NewCol均为1
预期最终结果:
data.frame( ID=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3), Year=c(2010,2011,2012,2013,2014,2010,2011,2012,2013,2014, 2010,2011,2012,2013,2014), Value = c(1,1,0,0,0, 0,1,1,1,1, 1,0,0,0,0), NewCol = c(0,0,0,0,0,1,1,1,1,1,0,0,0,0,0) )
用户尝试的代码仅能修改符合条件的单行,无法为整组统一赋值:
df %>% group_by(ID) %>% mutate(NewCol = ifelse(Year == 2012 & Value == 0, 0, 1))
解决方案
使用dplyr的any()函数在分组内判断是否存在满足条件的行,从而为整组统一赋值:
library(dplyr) df_result <- df %>% group_by(ID) %>% mutate(NewCol = ifelse(any(Year == 2012 & Value == 0), 0, 1)) %>% ungroup() # 可选,取消分组状态,便于后续操作
代码说明
group_by(ID):按ID分组处理数据any(Year == 2012 & Value == 0):检查当前分组内是否存在至少一行满足Year=2012且Value=0的条件,返回布尔值TRUE/FALSEifelse(..., 0, 1):将布尔结果转换为0或1,为整组所有行统一赋值NewCol
运行上述代码后,得到的df_result与预期结果完全一致。
内容的提问来源于stack exchange,提问作者JoseMM
相关产品推荐
相关产品推荐

