基于Subscriberid匹配行数不等的Data Frame并在第二个中新增列
没问题,我来帮你搞定这个基于subscriberid匹配两个数据框并在DF2里新增列的需求~
首先先把你给出的两个数据框完整定义出来(补全了DF2的结构):
# 定义DF1 DF1 <- structure(list(subscriberid = c(1085369583, 1244038459, 1240958486, 1088671175), cweAge = c(32, 30, 49, 30), cweGen = c("m", "m", "m", "m"), hwAge = c(60, 30, 47, 30), hwGen = c("f", "f", "f", "f"), cwe = c(1, 1, 1, 1), hw = c(1, 1, 1, 1)), .Names = c("subscriberid", "cweAge", "cweGen", "hwAge", "hwGen", "cwe", "hw"), row.names = 453:456, class = "data.frame") # 定义DF2 DF2 <- structure(list(subscriberid = c(1244038459, 1240958486, 1234200861)), class = "data.frame")
接下来提供两种常用的实现方法,你可以根据自己的习惯选择:
方法1:基础R的merge函数
用左连接(保留DF2的所有行)来匹配数据,把DF1中对应subscriberid的列全部添加到DF2中:
DF2_updated <- merge(DF2, DF1, by = "subscriberid", all.x = TRUE)
- 参数说明:
by = "subscriberid"指定匹配的键列;all.x = TRUE表示保留左表(DF2)的所有行,未匹配到的subscriberid对应的DF1列会填充NA。
方法2:tidyverse的dplyr::left_join
如果你习惯用tidyverse风格的代码,left_join会更直观:
library(dplyr) DF2_updated <- DF2 %>% left_join(DF1, by = "subscriberid")
这个方法和上面的merge效果完全一致,只是语法更简洁流畅。
可选:只添加DF1中的特定列
如果不需要把DF1的所有列都加进来,比如只想添加cweAge和cweGen,可以这样做:
基础R版本:
DF2_updated <- merge(DF2, DF1[, c("subscriberid", "cweAge", "cweGen")], by = "subscriberid", all.x = TRUE)
dplyr版本:
DF2_updated <- DF2 %>% left_join(DF1 %>% select(subscriberid, cweAge, cweGen), by = "subscriberid")
运行完上述代码后,DF2_updated就是你要的结果:保留DF2的所有行,同时新增了DF1中匹配到的列。
内容的提问来源于stack exchange,提问作者Apricot
相关产品推荐
相关产品推荐

