如何在R中合并tibble子集的行并修改指定字段?
解决方案
处理逻辑
直接拆分处理再合并是最稳妥的方案:把TIBS里来自T_tib1的部分单独做转换,剩下的T_tib2、T_tib3原封不动,最后拼回去即可,不用折腾全量修改。
代码实现
首先要确保合并后的TIBS有能区分来源的字段——如果合并前没加,先给每个原始tibble补个标记:
library(dplyr) # 给每个原始tibble添加来源标记 T_tib1 <- T_tib1 %>% mutate(source = "tib1") T_tib2 <- T_tib2 %>% mutate(source = "tib2") T_tib3 <- T_tib3 %>% mutate(source = "tib3") # 合并成TIBS(如果已经合并过,这步跳过) TIBS <- bind_rows(T_tib1, T_tib2, T_tib3)
然后针对性处理T_tib1的部分:
# 处理T_tib1的数据:按Brand合并行+填充Share_*列NA+修改Data_Type processed_tib1 <- TIBS %>% filter(source == "tib1") %>% group_by(Brand) %>% summarise( # 填充Share开头列的NA值(取同Brand下的非NA值,适合单有效数据场景) across(starts_with("Share_"), ~ coalesce(!!!.)), # 保留其他字段的第一个有效值(根据你的数据逻辑调整,比如取last()也可以) across(-c(Brand, starts_with("Share_")), ~ first(.)), # 强制修改Data_Type字段 Data_Type = "Retail Volume (Tonnes or Litres)" ) %>% ungroup() # 合并处理后的tib1和原tib2、tib3数据 final_TIBS <- bind_rows(processed_tib1, TIBS %>% filter(source != "tib1"))
关键细节
- 如果
Share_*列在同一个Brand下有多个非NA值,把coalesce(!!!.)改成你需要的聚合逻辑,比如sum(., na.rm = TRUE)或者mean(., na.rm = TRUE)。 - 这种方式不会破坏原
TIBS的其他部分,只精准处理来自T_tib1的数据,避免了单独维护多个临时数据集的麻烦。
内容的提问来源于stack exchange,提问作者Matteo Bulgarelli
相关产品推荐
相关产品推荐

