基于多条件聚合行:R语言按col1分组合并数据的方案问询
R语言数据框合并与填充问题处理
原始数据框
df <- data.frame(col1 = c("a", "a", "b", "b", "c", "c"), col2 = c("x1", "x1.1", "x2", "x2.1", "x3", "x3.1"), col3 = c(1, NA, 2, NA, 3, NA), col4 = c(NA, 1, NA, 2, NA, 3)) df # 输出结果: # col1 col2 col3 col4 # 1 a x1 1 NA # 2 a x1.1 NA 1 # 3 b x2 2 NA # 4 b x2.1 NA 2 # 5 c x3 3 NA # 6 c x3.1 NA 3
需求说明
- 合并
col1列值相同的行 - 最终保留的行需对应
col2为x1/x2/x3这类格式,同时将同组内x1.1/x2.1/x3.1的col4值填充到对应行 - 期望输出:
col1 col2 col3 col4 1 a x1 1 1 2 b x2 2 2 3 c x3 3 3
初步思路
针对col2 == "x1"的行,用同组内col2 == "x1.1"的col4值填充;同理处理x2/x2.1、x3/x3.1组合,希望通过group_by(col1)实现该逻辑。
补充说明:已绘制可视化图辅助理解,实际数据集的值与示例不同。
已实现的解决方案
df |> mutate(col2 = substring(col2, 1,2)) |> mutate_if(is.numeric, ~replace(., is.na(.), "")) |> group_by(col1, col2) |> summarise(across(c(col3, col4), ~toString(.)), .groups = "drop") |> mutate(col3 = str_remove(col3, ",")) |> mutate(col4 = str_remove(col4, ", "))
优化建议
方案1:直接提取非NA值(更高效简洁)
避免字符串转换与清理步骤,直接在分组内提取非NA值:
library(dplyr) df |> mutate(col2 = substr(col2, 1, 2)) |> # 统一col2前缀,将x1/x1.1合并为x1 group_by(col1, col2) |> summarise( col3 = first(na.omit(col3)), col4 = first(na.omit(col4)), .groups = "drop" )
方案2:保留原始col2格式
无需修改col2原始值,直接筛选出不带小数点的col2行并填充对应值:
library(dplyr) df |> group_by(col1) |> summarise( col2 = first(col2[!grepl("\\.", col2)]), # 取分组内不带小数点的col2值 col3 = first(na.omit(col3)), col4 = first(na.omit(col4)), .groups = "drop" )
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

