You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多条件聚合行: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:35:10