如何合并含共同列的R语言data.frame并获取指定结果?
合并两个R语言data.frame并处理共同列的解决方案
问题说明
需要合并df_stock和df_flux两个data.frame:
- 保留所有行(以
df_stock的行为基准) - 合并所有日期列,共同日期列(如
2023-11-01)需用df_flux的值覆盖df_stock对应行的值 - 缺失值用NA填充,最终得到指定的
expected_result
原始数据
数据定义代码
df_stock <- data.frame( CODE_S = c("57210390", "33210390"), `2023-04-01` = c(1.1, 1.5), `2023-11-01` = c(3.1, 4.2), check.names = FALSE) df_flux <- data.frame( CODE_S = c("57210390"), `2023-10-01` = c(1.25), `2023-11-01` = c(1.31), check.names = FALSE) expected_result <- data.frame( CODE_S = c("57210390", "33210390"), `2023-04-01` = c(1.1, 1.5), `2023-10-01` = c(1.25,NA), `2023-11-01` = c(1.31, 4.2), check.names = FALSE)
数据展示
> df_stock CODE_S 2023-04-01 2023-11-01 1 57210390 1.1 3.1 2 33210390 1.5 4.2 > df_flux CODE_S 2023-10-01 2023-11-01 1 57210390 1.25 1.31 > expected_result CODE_S 2023-04-01 2023-10-01 2023-11-01 1 57210390 1.1 1.25 1.31 2 33210390 1.5 NA 4.20
解决方案
方法1:使用dplyr包(推荐)
通过left_join合并数据,结合coalesce优先取df_flux的值覆盖共同列:
library(dplyr) # 按CODE_S合并,保留df_stock所有行 merged_df <- left_join(df_stock, df_flux, by = "CODE_S") # 处理共同日期列:优先用df_flux的数值,否则保留df_stock的数值 common_date_cols <- setdiff(intersect(names(df_stock), names(df_flux)), "CODE_S") for(col in common_date_cols) { merged_df[[col]] <- coalesce(merged_df[[paste0(col, ".y")]], merged_df[[paste0(col, ".x")]]) merged_df <- merged_df %>% select(-all_of(paste0(col, c(".x", ".y")))) } # 调整列顺序与预期结果一致 merged_df <- merged_df %>% select(CODE_S, sort(names(merged_df)[-1])) # 查看结果 merged_df
方法2:基础R实现
无需额外包,手动合并并处理共同列:
# 合并数据,保留df_stock所有行 merged_df <- merge(df_stock, df_flux, by = "CODE_S", all.x = TRUE) # 处理共同日期列 common_date_cols <- setdiff(intersect(names(df_stock), names(df_flux)), "CODE_S") for(col in common_date_cols) { merged_df[[col]] <- ifelse(!is.na(merged_df[[paste0(col, ".y")]]), merged_df[[paste0(col, ".y")]], merged_df[[paste0(col, ".x")]]) merged_df <- merged_df[, !names(merged_df) %in% paste0(col, c(".x", ".y"))] } # 调整列顺序 col_order <- c("CODE_S", sort(setdiff(names(merged_df), "CODE_S"))) merged_df <- merged_df[, col_order] # 查看结果 merged_df
两种方法运行后均可得到与expected_result完全一致的输出。
内容的提问来源于stack exchange,提问作者Damien Dotta
相关产品推荐
相关产品推荐

