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

使用merge()函数时,如何保留by.x与by.y指定的两列?

问题解决

一、保留books数据框的name列

默认merge()会将用于匹配的两列(authors$surname和books$name)合并为一列,要保留books$name,可以在合并前给books复制一列该变量,再执行合并:

# 先给books新增一列保存原name值
books$books_name <- books$name
# 执行合并
m <- merge(authors, books, by.x = "surname", by.y = "name", all = TRUE)
# 查看结果
head(m, 3)

执行后结果会包含surname(来自authors)和books_name(来自books的原name列),同时保留其他所有列。

如果习惯用dplyr包,也可以用以下方式实现:

library(dplyr)
m <- authors %>%
  full_join(books %>% rename(books_name = name), 
            by = c("surname" = "name"))

二、检查匹配变量的拼写差异

可以通过几种base R方法排查拼写错误或不匹配的元素:

  1. 找出两边独有的元素:
# authors里有但books里没有的姓氏
authors_only <- setdiff(authors$surname, books$name)
# books里有但authors里没有的名字
books_only <- setdiff(books$name, authors$surname)

cat("authors独有的姓氏:", authors_only, "\n")
cat("books独有的名字:", books_only, "\n")

示例中books_only会返回"R Core",属于合理差异;如果存在拼写错误(比如把"Tukey"写成"Tukeyy"),会在这里被直接识别。

  1. 统计元素出现频率排查异常:
# 统计authors中各姓氏的出现次数
table(authors$surname)
# 统计books中各名字的出现次数
table(books$name)

若存在拼写错误,会出现频率异常(比如本该重复出现的元素仅出现一次,或出现陌生拼写)。

  1. 模糊匹配检测近似拼写:
    如果怀疑有近似拼写错误(如大小写、多空格、字母增减),可以用stringdist包计算字符串距离,定位相似度高的不匹配元素:
library(stringdist)
# 遍历authors的姓氏,找books中距离最近的名字
for(s in authors$surname){
  dists <- stringdist(s, books$name, method = "lv")
  min_dist <- min(dists)
  if(min_dist > 0){
    cat("姓氏", s, "在books中无完全匹配,最接近的是", books$name[which.min(dists)], ",距离为", min_dist, "\n")
  }
}

这种方法能快速定位类似"Tukey"和"Tukeyy"这类近似错误。


内容的提问来源于stack exchange,提问作者user2955884

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:58:19