在dplyr中左连接数据框后,如何仅保留右表匹配列并删除左表重复列
在dplyr中删除左连接后的所有.x列,保留.y列
这是个非常常见的数据处理场景,我来给你分享几个简洁高效的解决方案:
方法1:提前筛选列,避免生成冗余列
如果从一开始就确定只需要左表的ID列和右表的所有数值列,那在连接前先把左表的冗余列去掉,这样连接后就不会出现.x和.y的后缀,一步到位:
library(dplyr) # 模拟多列数据(Val1、Val2...Valn-1) dataA <- data.frame(ID = c("1","b","c"), Val1 = c(1,2,3), Val2 = c(10,20,30)) dataB <- data.frame(ID = c("1","b","c"), Val1 = c(4,5,6), Val2 = c(40,50,60)) # 只保留dataA的ID列,再左连接dataB clean_data <- dataA %>% select(ID) %>% left_join(dataB, by = "ID") clean_data # ID Val1 Val2 # 1 1 4 40 # 2 b 5 50 # 3 c 6 60
方法2:连接后删除所有.x列并清理后缀
如果已经完成了连接操作,想要直接处理生成的.x和.y列,可以用select排除.x列,再用rename_with去掉.y后缀,恢复原列名:
# 先执行你的左连接 data <- dataA %>% left_join(dataB, by = "ID") # 删除.x列,并重命名.y列 clean_data <- data %>% # 排除所有以.x结尾的列 select(-ends_with(".x")) %>% # 去掉.y后缀 rename_with(~ sub("\\.y$", "", .x), ends_with(".y")) clean_data
你也可以反过来,直接选择ID和所有以.y结尾的列,再清理后缀:
clean_data <- data %>% select(ID, ends_with(".y")) %>% rename_with(~ sub("\\.y$", "", .x), ends_with(".y"))
关键函数说明
ends_with(".x")/ends_with(".y"):dplyr的选择器函数,快速匹配所有以指定后缀结尾的列rename_with():批量重命名列,配合正则表达式sub("\\.y$", "", .x)可以精准去掉.y后缀select(-列名):用负号排除指定列,适合快速删除冗余列
内容的提问来源于stack exchange,提问作者itthrill
相关产品推荐
相关产品推荐

