如何用dplyr基于分组首行添加带修改因子水平的新行
简洁实现分组添加指定行的方法
核心思路
无需逐个指定37个变量,利用dplyr的分组+切片+变量修改组合操作,仅关注要修改的slyr字段,其余字段自动继承组内首行的值。
步骤1:扩展因子水平(必做,避免NA)
由于slyr是因子类型,直接赋值新水平会导致值变为NA,需先扩展其因子水平:
library(dplyr) library(forcats) # 为slyr添加新因子水平"agrnd" df <- df %>% mutate(slyr = fct_expand(slyr, "agrnd"))
若slyr不是因子类型,此步骤可跳过。
步骤2:生成新行并合并
有两种简洁写法可选:
写法1:拆分生成新行再合并
# 按pl分组提取每组首行,修改slyr为"agrnd"得到新行集合 new_rows <- df %>% group_by(pl) %>% slice_head(n = 1) %>% mutate(slyr = "agrnd") %>% ungroup() # 合并原数据与新行,可选按pl排序让新行与对应组相邻 result <- bind_rows(df, new_rows) %>% arrange(pl)
写法2:分组内直接合并(更紧凑)
用group_modify在每个分组内直接绑定原数据与新行:
result <- df %>% mutate(slyr = fct_expand(slyr, "agrnd")) %>% group_by(pl) %>% group_modify(~ bind_rows(.x, mutate(slice_head(.x, n=1), slyr = "agrnd"))) %>% ungroup()
代码说明
slice_head(n=1):提取每组第一行,确保其余37个变量复用组内首行的值;mutate(slyr = "agrnd"):仅修改目标字段,其余字段自动保留;group_modify:遍历每个分组完成组内数据合并,无需单独生成新行再合并;fct_expand:安全扩展因子水平,避免新值被转为NA。
内容的提问来源于stack exchange,提问作者SimonBoreal
相关产品推荐
相关产品推荐

