如何在R语言中按cod_user分组合并数据框行?
合并tibble中用户的多行月度数据为单行
问题背景
现有一个tibble数据框,每个cod_user的月度存在/缺失标记分散在多行中(每行对应一个月份的有效数值,其余月份为NA),需要将同一用户的多行数据合并为单行,汇总所有月份的数值。
原始数据
# A tibble: 24 × 5 cod_user ene feb mar abr <chr> <dbl> <dbl> <dbl> <dbl> 1 ES7823 1 NA NA NA 2 AR3442 1 NA NA NA 3 CO9382 1 NA NA NA 4 ES5611 1 NA NA NA 5 IT9982 1 NA NA NA 6 PT6628 1 NA NA NA 7 ES7823 NA 1 NA NA 8 AR3442 NA 1 NA NA 9 CO9382 NA 0 NA NA 10 ES5611 NA 1 NA NA 11 IT9982 NA 1 NA NA 12 PT6628 NA 0 NA NA 13 ES7823 NA NA 1 NA 14 AR3442 NA NA 1 NA 15 CO9382 NA NA 0 NA 16 ES5611 NA NA 1 NA 17 IT9982 NA NA 0 NA 18 PT6628 NA NA 0 NA 19 ES7823 NA NA NA 0 20 AR3442 NA NA NA 1 21 CO9382 NA NA NA 0 22 ES5611 NA NA NA 1 23 IT9982 NA NA NA 0 24 PT6628 NA NA NA 0
期望输出
cod_user ene feb mar abr <chr> <dbl> <dbl> <dbl> <dbl> 1 ES7823 1 1 1 0 2 AR3442 1 1 1 1 3 CO9382 1 0 0 0
解决方案
使用dplyr包的分组聚合功能,按cod_user分组后提取每个月度列的有效数值。
代码实现
方式一:逐个指定列处理
library(dplyr) # 假设原始数据框为df merged_df <- df %>% group_by(cod_user) %>% summarize( ene = first(na.omit(ene)), feb = first(na.omit(feb)), mar = first(na.omit(mar)), abr = first(na.omit(abr)), .groups = "drop" )
方式二:批量处理月度列(更简洁)
merged_df <- df %>% group_by(cod_user) %>% summarize(across(ene:abr, ~first(na.omit(.x))), .groups = "drop")
关键说明
group_by(cod_user):按用户ID分组,确保同一用户的所有行被归为一组across(ene:abr, ~first(na.omit(.x))):对ene到abr的所有月度列,提取组内第一个非NA值(由于数据结构中每个用户每个月份仅一个有效数值,first可替换为max(., na.rm = TRUE)或min(., na.rm = TRUE),结果一致).groups = "drop":聚合完成后取消分组状态,返回常规tibble
内容的提问来源于stack exchange,提问作者IPLNAD
相关产品推荐
相关产品推荐

