基于公共列合并两个DataFrame,仅保留A的列,缺失值填充为NA
问题描述
我有两个存在公共列的DataFrame,结构如下所示:
DataFrame A
structure(list(Firm = c("Alex", NA, NA), Postal.Code = c("V0N 1B4", "V0N 1B4", "V0N 1B4"), sold.month = c(NA_real_, NA_real_, NA_real_ ), sold.year = c(NA_real_, NA_real_, NA_real_), sold.qtr = c(NA_real_, NA_real_, NA_real_), List.year = c(2018, 2018, 2018), List.Date.Year.quarter = c("2018 Q2", "2018 Q2", "2018 Q2")), row.names = c(NA, 3L), class = "data.frame")
打印结果:
Firm Postal.Code sold.month sold.year sold.qtr List.year List.Date.Year.quarter 1 Alex V0N 1B4 NA NA NA 2018 2018 Q2 2 <NA> V0N 1B4 NA NA NA 2018 2018 Q2 3 <NA> V0N 1B4 NA NA NA 2018 2018 Q2
DataFrame B
structure(list(sold.month = c(NA, 1L, 1L), sold.year = c(NA, 2020L, 2020L), sold.qtr = c(NA, 1L, 1L), List.Date.Year.quarter = structure(c(2019.75, 2019.75, 2019.75), class = "yearqtr"), List.Date.Year.month = structure(c(2019.75, 2019.91666666667, 2019.91666666667), class = "yearmon"), Sold.Date.Year.month = structure(c(NA, 2020, 2020), class = "yearmon")), row.names = c(NA, 3L), class = "data.frame")
打印结果:
sold.month sold.year sold.qtr List.Date.Year.quarter List.Date.Year.month Sold.Date.Year.month 1 NA NA NA 2019 Q4 Oct 2019 <NA> 2 1 2020 1 2019 Q4 Dec 2019 Jan 2020 3 1 2020 1 2019 Q4 Dec 2019 Jan 2020
需求
仅合并DataFrame B中在DataFrame A里存在的列,若DataFrame A的列在B中不存在,对应值显示为NA。
预期输出
Firm Postal.Code sold.month sold.year sold.qtr List.year List.Date.Year.quarter 1 Alex V0N 1B4 NA NA NA 2018 2018 Q2 2 <NA> V0N 1B4 NA NA NA 2018 2018 Q2 3 <NA> V0N 1B4 NA NA NA 2018 2018 Q2 4 NA NA NA NA NA NA 2019 Q4 5 NA NA 1 2020 1 NA 2019 Q4 6 NA NA 1 2020 1 NA 2019 Q4
解决方案
核心逻辑是先对齐两个表的列结构再按行拼接,步骤如下:
- 先统一公共列的类型,避免拼接时报错:DataFrame A的
List.Date.Year.quarter是字符串类型,DataFrame B的对应列是yearqtr类型,先转成一致的字符串格式 - 提取DataFrame A的所有列名作为最终输出的列顺序标准
- 给DataFrame B补充A有但B没有的列,赋值为NA,同时删掉B中A不存在的列
- 按A的列顺序重排B的列后,直接拼接两个表即可
示例代码:
# 加载zoo包处理yearqtr类型转换,如已加载可跳过 library(zoo) # 统一公共列类型 df_b$List.Date.Year.quarter <- as.character(df_b$List.Date.Year.quarter) # 提取A的列名作为标准 cols_a <- colnames(df_a) # 处理B的列:保留和A共有的列,补充A有B无的列赋值为NA df_b_processed <- df_b[, intersect(cols_a, colnames(df_b)), drop = FALSE] df_b_processed[setdiff(cols_a, colnames(df_b))] <- NA # 按A的列顺序重排B的列 df_b_processed <- df_b_processed[, cols_a, drop = FALSE] # 拼接得到最终结果 result <- rbind(df_a, df_b_processed)
运行后得到的result即为符合要求的输出。
内容的提问来源于stack exchange,提问作者Yellow_truffle
相关产品推荐
相关产品推荐

