在R中依据另一张表键值替换数据库中对应文本的实现方法
解决方案
前置清洗(解决大部分merge失败问题)
merge失效90%以上的原因是两张表的匹配字段存在格式差异,比如前后空格、大小写不一致、特殊符号转义差异,先统一格式:
# 假设表A中作者姓名字段名为author,主键字段名为id_library A$author <- trimws(tolower(A$author)) # 假设表B中作者姓名字段名为author B$author <- trimws(tolower(B$author))
如果两张表的作者字段名不一致,把上面代码里的字段名替换成实际的字段名即可。
方法1:基础R merge实现
# all.x=TRUE 保证保留表B的所有行,不会因为匹配不到丢失数据 B_result <- merge(B, A[,c("author", "id_library")], by = "author", all.x = TRUE) # 移除原有的作者姓名列,只保留替换后的主键 B_result$author <- NULL # 如果需要把主键列名改回原来的author,可执行下面的代码 # names(B_result)[names(B_result) == "id_library"] <- "author"
如果你的两张表作者字段名不同,调整merge的by参数即可:比如表A作者字段是author_name,表B是name,就把by参数改成by.x = "name", by.y = "author_name"。
方法2:dplyr left_join实现(代码更易读)
library(dplyr) B_result <- B %>% left_join(A %>% select(author, id_library), by = "author") %>% select(-author) # 如需改名可追加一行:rename(author = id_library)
异常排查
如果匹配后出现NA值,说明对应的作者姓名没有在表A中收录,需要先补全表A的映射数据后再重新执行匹配。
内容的提问来源于stack exchange,提问作者Gustavo Herrarte
相关产品推荐
相关产品推荐

