You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:48:41