R语言:不使用merge函数添加非分组变量的方法问询
问题解答
你的这段代码不可行,核心问题如下:
total_dose是分组聚合后的结果(每组仅1行),但你用原始数据df的多维度分组条件去拆分它,两者行数完全不匹配,会导致数据无意义重复或结构混乱;total_dose本身只包含pid、medname、date、op1四个字段,拆分合并后也无法自动生成dose、var1等缺失变量。
正确实现方案
根据你的需求(保留dose、var1/2/3且不用merge),分两种场景处理:
场景1:保留原始数据所有行,同时添加组内求和值
如果需要保留每一行的原始dose和var1/2/3,同时新增该组的求和结果op1,用mutate替代summarize即可——它会在原始数据基础上新增列,自动保留所有未参与分组的变量:
total_dose <- df %>% group_by(pid, medname, date) %>% mutate(op1 = sum(dose)) %>% ungroup() # 可选,取消分组状态,方便后续操作 head(total_dose, 10)
输出结果会包含所有你需要的字段:pid、medname、date、dose、op1、var1、var2、var3。
场景2:仅保留每组一行,同时带上组内唯一的var1/2/3
如果var1/2/3在同一分组内的值完全一致(即每组内所有行的这些变量无差异),可以在summarize中直接指定保留这些变量,同时按需处理dose(比如取组内第一个值):
total_dose <- df %>% group_by(pid, medname, date) %>% summarize( op1 = sum(dose), dose = first(dose), # 若需保留dose,明确取组内某一个值,比如第一个 var1 = first(var1), var2 = first(var2), var3 = first(var3) ) %>% ungroup()
注意:如果var1/2/3在同一分组内有不同值,需明确用first()/last()/mean()等函数定义保留规则,否则会出现数据歧义。
内容的提问来源于stack exchange,提问作者db2020
相关产品推荐
相关产品推荐

