如何将两个R语言DataFrame的列合并,不匹配值填充NA?
实现两个DataFrame的指定合并方式
你需要的是将两个DataFrame按值匹配对齐,保留所有元素,独有的元素对应另一列补NA,以下是几种可行的实现方法:
方法一:使用dplyr包(推荐,代码简洁)
先给每个DataFrame添加以自身列值为键的临时列,再通过全连接合并,最后保留目标列:
library(dplyr) # 构造带键的临时数据框 df1_with_key <- df1 %>% mutate(key = column_df1) df2_with_key <- df2 %>% mutate(key = column_df2) # 全连接并整理列 df3 <- full_join(df1_with_key, df2_with_key, by = "key") %>% select(column_df1, column_df2)
运行后得到的df3结构完全符合你的需求:
column_df1 column_df2 1 A A 2 B B 3 C C 4 D <NA> 5 <NA> E
方法二:使用base R原生merge函数
无需额外安装包,用base R的merge函数实现全连接:
# 给数据框添加键列 df1_with_key <- transform(df1, key = column_df1) df2_with_key <- transform(df2, key = column_df2) # 全合并并筛选目标列 df3 <- merge(df1_with_key, df2_with_key, by = "key", all = TRUE)[, c("column_df1", "column_df2")]
方法三:手动构造(不依赖任何第三方包)
先获取所有值的并集,再分别匹配填充:
# 获取两个列的所有唯一值并集 all_values <- union(df1$column_df1, df2$column_df2) # 分别生成两个目标列,匹配到的保留值,否则填NA column_df1 <- ifelse(all_values %in% df1$column_df1, all_values, NA) column_df2 <- ifelse(all_values %in% df2$column_df2, all_values, NA) # 组合成最终数据框 df3 <- data.frame(column_df1, column_df2)
内容的提问来源于stack exchange,提问作者roybatty
相关产品推荐
相关产品推荐

