left_join合并DataFrame后右表非合并变量为NA,NAME匹配异常排查
视觉一致的NAME匹配失败导致left_join右表全NA的原因
你遇到的核心问题是字符串表面一致但底层编码/内容存在差异,导致left_join无法匹配,进而右表字段全为NA。常见原因及验证、解决方法如下:
不可见控制字符:字符串里藏了换行符
\n、制表符\t或者回车符\r,肉眼看不到但会改变字符串内容。
验证方法:用charToRaw()查看原始字节,对比两个字符串的字节序列:# 对比两个NAME的原始字节 charToRaw(sda$NAME[a]) charToRaw(df2$NAME[b])解决:用
gsub()清除所有非打印字符:sda$NAME <- gsub("[[:cntrl:]]", "", sda$NAME) df2$NAME <- gsub("[[:cntrl:]]", "", df2$NAME)全角/半角字符差异:比如全角的英文字母、数字(
AvsA,1vs1),视觉完全一致但编码不同。
验证方法:用utf8ToInt()查看每个字符的Unicode编码值:utf8ToInt(sda$NAME[a]) utf8ToInt(df2$NAME[b])解决:用
stringi::stri_trans_general()把全角转半角:library(stringi) sda$NAME <- stri_trans_general(sda$NAME, "fullwidth-halfwidth") df2$NAME <- stri_trans_general(df2$NAME, "fullwidth-halfwidth")字符编码不统一:两个数据框的NAME字段编码不同(比如一个是UTF-8,一个是GBK),会导致表面相同的字符串无法匹配。
验证方法:查看字段编码:Encoding(sda$NAME) Encoding(df2$NAME)解决:统一转为UTF-8编码:
sda$NAME <- iconv(sda$NAME, from = Encoding(sda$NAME), to = "UTF-8") df2$NAME <- iconv(df2$NAME, from = Encoding(df2$NAME), to = "UTF-8")特殊大小写或Unicode变体:部分语言的字符大小写转换存在特殊规则,或者同一字符有不同的Unicode编码形式(比如带连字的
ff和两个f)。
验证方法:转成小写后再对比:tolower(sda$NAME[a]) == tolower(df2$NAME[b])解决:用
stringi::stri_trans_nfc()标准化Unicode字符:sda$NAME <- stri_trans_nfc(sda$NAME) df2$NAME <- stri_trans_nfc(df2$NAME)
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

