如何基于共享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
相关产品推荐
相关产品推荐

