R语言dplyr分组汇总 拼接字符串值为列表列保留原始值
实现方法
你提出的新增列分离原始字符串与计算值的思路完全可行,只需在分组汇总阶段同步处理两列即可,无需拆分两套逻辑。运行以下代码即可得到保留所有带(replaced)标注原始值的目标输出:
library(dplyr) dat_in_new <- dat %>% # 提前拆分两列:一列存原始字符串,一列提取纯数值用于计算 mutate( value_raw = value, value_num = as.numeric(gsub(" .*", "", value)) ) %>% # 按指定字段分组 group_by(rn, upper, direction) %>% # 同步完成数值求和、原始值留存 summarise( freq_calc = sum(value_num, na.rm = TRUE), freq_raw = first(value_raw), .groups = 'drop_last' ) %>% # 保留原有添加分组总计行的逻辑 group_modify(~add_row( ., freq_calc = sum(.$freq_calc), freq_raw = as.character(sum(.$freq_calc)) )) %>% # 按rn聚合为列表列 group_by(rn) %>% summarise( freq = list(freq_raw), .groups = "drop" )
逻辑说明
- 用正则
gsub(" .*", "", value)提取value字段中空格前的数字部分,无论条目后是否带(replaced)标注,都能正确转换为数值,求和结果和你原有代码的计算结果完全一致 - 同一
rn + upper + direction分组下仅对应唯一一条value记录,汇总时直接取原始字符串存入freq_raw即可,不会出现错配 - 总计行是分组求和得到的数值,直接转为字符串存入即可,和其他行格式统一
输出效果
运行后得到的数据集结构完全符合预期:
# A tibble: 2 × 2 rn freq <chr> <list> 1 A <chr [25]> 2 B <chr [25]>
查看列表列内的内容,所有带(replaced)的原始标注均完整保留,总计行的求和值也正常存入。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

