使用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方法排查拼写错误或不匹配的元素:
- 找出两边独有的元素:
# 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"),会在这里被直接识别。
- 统计元素出现频率排查异常:
# 统计authors中各姓氏的出现次数 table(authors$surname) # 统计books中各名字的出现次数 table(books$name)
若存在拼写错误,会出现频率异常(比如本该重复出现的元素仅出现一次,或出现陌生拼写)。
- 模糊匹配检测近似拼写:
如果怀疑有近似拼写错误(如大小写、多空格、字母增减),可以用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
相关产品推荐
相关产品推荐

