如何为不等长的df1添加df2指定列?仅匹配col1添加col5
解决方案:仅匹配添加指定列到数据框
首先修正你提供的数据框构造代码中的语法错误:
df1 <- data.frame( c(1,1,1,2,2,2,3,3,3), c(9,9,9,8,8,8,7,7,7), c(6,6,6,5,5,5,4,4,4), c('A','A','A','B','B','B','C','C','C') ) colnames(df1) <- c('col1','col2','col3', 'col4') df2 <- data.frame( c(1,2,3), c(100,200,300), c('D','E','F') ) colnames(df2) <- c('col1','col5', 'col6')
以下是几种满足需求的可行方案:
方法1:优化left_join避免多余列
既然你已经尝试过left_join,只需在合并时限定df2的列,就能避免引入不需要的col6:
library(dplyr) # 仅选取df2中用于匹配和需要新增的列 df_result <- df1 %>% left_join(df2 %>% select(col1, col5), by = "col1")
方法2:用mutate+match直接赋值
无需合并整个数据框,通过匹配位置直接给df1新增列:
library(dplyr) df_result <- df1 %>% mutate(col5 = df2$col5[match(col1, df2$col1)])
基础R版本写法:
df_result <- df1 df_result$col5 <- df2$col5[match(df_result$col1, df2$col1)]
方法3:基础R的merge函数指定列
利用merge的参数控制匹配逻辑和保留列:
# 只取df2的col1和col5进行匹配,all.x=TRUE保留df1所有行 df_result <- merge(df1, df2[, c("col1", "col5")], by = "col1", all.x = TRUE)
以上三种方法最终得到的df_result都会包含col1、col2、col3、col4、col5五列,完全符合你的需求。
内容的提问来源于stack exchange,提问作者ambergris
相关产品推荐
相关产品推荐

