合并DataFrame后添加列标识数据来源的R语言实现方法
在R中全量合并DataFrame并标记数据来源
这里提供几种实用的实现方式,帮你完成全量合并并新增来源标记列的需求:
方法一:基础R原生实现
先完成全量合并,再根据合并后列的缺失情况判断数据来源:
set.seed(1) df1 <- data.frame(id = 1:10, cat = rpois(10, 1)) df2 <- data.frame(id = 8:13, dog = rpois(6, 1)) # 按id执行全量合并 merged_df <- merge(df1, df2, all = TRUE, by = "id") # 新增which列标记数据来源 merged_df$which <- with(merged_df, ifelse(!is.na(cat) & is.na(dog), "df1", ifelse(is.na(cat) & !is.na(dog), "df2", "both")))
运行后得到的结果与你期望的完全一致:
print(merged_df) # id cat dog which # 1 1 0 NA df1 # 2 2 1 NA df1 # 3 3 1 NA df1 # 4 4 2 NA df1 # 5 5 0 NA df1 # 6 6 2 NA df1 # 7 7 3 NA df1 # 8 8 1 0 both # 9 9 1 0 both # 10 10 0 1 both # 11 11 NA 1 df2 # 12 12 NA 2 df2 # 13 13 NA 1 df2
方法二:用dplyr实现(逻辑更清晰)
如果习惯使用tidyverse系列工具,dplyr的case_when能让判断逻辑更直观:
library(dplyr) set.seed(1) df1 <- data.frame(id = 1:10, cat = rpois(10, 1)) df2 <- data.frame(id = 8:13, dog = rpois(6, 1)) merged_df <- full_join(df1, df2, by = "id") %>% mutate(which = case_when( !is.na(cat) & is.na(dog) ~ "df1", is.na(cat) & !is.na(dog) ~ "df2", TRUE ~ "both" ))
方法三:先标记来源再合并(适配复杂场景)
如果原DataFrame的列本身可能存在缺失值,前两种方法会出错。这时可以先给每个数据集添加专属标记,再合并判断:
library(dplyr) set.seed(1) df1 <- data.frame(id = 1:10, cat = rpois(10, 1)) %>% mutate(source = "df1") df2 <- data.frame(id = 8:13, dog = rpois(6, 1)) %>% mutate(source = "df2") merged_df <- full_join(df1, df2, by = "id") %>% mutate(which = case_when( !is.na(source.x) & is.na(source.y) ~ "df1", is.na(source.x) & !is.na(source.y) ~ "df2", TRUE ~ "both" )) %>% select(-source.x, -source.y) # 移除临时标记列
这种方法不受原数据列缺失的影响,适用性更强。
内容的提问来源于stack exchange,提问作者Maël
相关产品推荐
相关产品推荐

