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

如何基于共享id合并列并填充值?(Tidyverse/Dplyr实现)

用tidyverse/dplyr实现按id合并不同group的minutes值并保留group1行

示例数据

先构造符合需求的示例数据集,方便验证代码逻辑:

library(tidyverse)

sample_data <- tibble(
  id = c(1,1,1,2,2,3),
  group = c(1,2,3,1,3,1),
  code = c("A", NA, NA, "B", NA, "C"),
  minutes1 = c(10, NA, NA, 15, NA, 20),
  minutes2 = c(NA, 20, NA, NA, NA, NA),
  minutes3 = c(NA, NA, 30, NA, 35, NA)
)

解决方案一:分组聚合提取非NA值

直接按id分组,对每个列提取唯一非NA值,操作简洁高效:

result <- sample_data %>%
  group_by(id) %>%
  summarize(
    # 提取group1的code(仅group1行有非NA值)
    code = first(na.omit(code)),
    # 提取每个minutes列的有效数值(每个id对应列仅一个非NA值)
    minutes1 = first(na.omit(minutes1)),
    minutes2 = first(na.omit(minutes2)),
    minutes3 = first(na.omit(minutes3)),
    # 固定group列为1
    group = 1
  ) %>%
  ungroup()

解决方案二:筛选+左连接合并

如果偏好分步操作,可先保留group1的行,再分别合并group2、3的分钟值:

result <- sample_data %>%
  # 先保留group1的所有行
  filter(group == 1) %>%
  # 左连接group2的minutes2值
  left_join(
    sample_data %>% filter(group == 2) %>% select(id, minutes2),
    by = "id"
  ) %>%
  # 左连接group3的minutes3值
  left_join(
    sample_data %>% filter(group == 3) %>% select(id, minutes3),
    by = "id"
  )

说明

  • 两种方法都兼容「部分id无group2/3」的情况,缺失对应group的minutes列会保留NA
  • 对于group1不固定数量的code,只要每个id下group1的code为非NA值,就能正确提取
  • 最终结果仅保留group1的行,且填充了同id下其他group的对应minutes值

内容的提问来源于stack exchange,提问作者Dr. Stats Guy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:10:19