如何使用含不同列的DataFrame更新主数据库并仅保留主数据库的列?
嗨,我来帮你搞定这个DataFrame合并的需求!你想要把更新用的df2合并到主数据库df1里,同时只保留df1原有的所有列,新增行里df1有但df2没有的列自动填NA,这个场景其实很常见,下面给你几种简单好用的实现方法:
首先先确认你的原始数据(方便复现):
# 主数据库df1 df1 <- data.frame(Bird_ID = c(1:6), Sex = c("Male","Female","Male","Male","Male","UNK"), Age.years = c("2","4","8","2","12","1")) # 更新用的df2 df2 <- data.frame(Bird_ID = c(7), Sex = c("Female"), date.fledged = c("19/10/2021"))
方法1:用dplyr的bind_rows(推荐)
tidyverse系列的dplyr包处理这类数据合并特别顺手,bind_rows会自动匹配列名,我们只需要先提取df2中与df1重叠的列,再合并就行:
library(dplyr) # 只取df2中存在于df1的列,再和df1合并 dfmerged <- bind_rows(df1, df2[, names(df1)])
这个方法逻辑很直观:先把df2的列限制成和df1完全一致的集合,合并后自然只会保留df1的列,缺失的Age.years列会自动填充NA,完美符合你的期望。
方法2:Base R原生实现
如果你不想加载额外的包,用base R也能轻松搞定,核心思路是先给df2补上df1有的但它没有的列(值设为NA),再用rbind合并:
# 给df2添加缺失的Age.years列,值为NA,再按df1的列顺序提取 df2_adjusted <- transform(df2, Age.years = NA)[names(df1)] # 合并两个DataFrame dfmerged <- rbind(df1, df2_adjusted)
方法3:用plyr包的rbind.fill
如果你习惯用plyr包,rbind.fill可以自动处理列不匹配的情况,之后我们再筛选出df1的列即可:
library(plyr) # 先合并所有列,再保留df1的列 dfmerged <- rbind.fill(df1, df2)[names(df1)]
验证结果
不管用哪种方法,最终得到的dfmerged都会和你期望的一致:
print(dfmerged) # Bird_ID Sex Age.years # 1 1 Male 2 # 2 2 Female 4 # 3 3 Male 8 # 4 4 Male 2 # 5 5 Male 12 # 6 6 UNK 1 # 7 7 Female <NA>
内容的提问来源于stack exchange,提问作者Andre230
相关产品推荐
相关产品推荐

