【问题标题】:identical strings from different data files won't match in R来自不同数据文件的相同字符串在 R 中不匹配
【发布时间】:2020-11-03 03:38:04
【问题描述】:

我正在合并一些文件,但两个文件不会 - 尽管有一个匹配的键列(我实际上是通过从另一个键列复制粘贴来生成一个键列)。这是最糟糕的事情,我担心我要么发疯,要么错过一些基本的东西。举个例子(我不知道如何使它可重现,因为当我将这些字符串复制并粘贴到新对象中时,它们比较好),这是我当前的控制台:

> q
[1] "1931 80th Anniversary"
> z
[1] "1931 80th Anniversary"
> q == z
[1] FALSE

我两个都试了,以防万一我错过了什么,而且...

> str(q)
 chr "1931 80th Anniversary"
> str(z)
 chr "1931 80th Anniversary"

这里会发生什么?

【问题讨论】:

  • OK - Encoding() 显示一个是 UTF-8 而另一个是“未知” - 所以。奇怪的。 iconv() 如果我 iconv 其中一个似乎可以解决它。这真的很奇怪。
  • 我无法使用您在此处提供的值进行复制,因此很难说出发生了什么。也许比较两个字符串的 charToRaw() 值。
  • dput(q)dput(z) 添加到您的帖子中。
  • 这很可能无济于事,但您的一个字符串中可能存在“隐藏”字符。我曾经经历过,也几乎发疯了。这是一个软连字符:请参阅:stackoverflow.com/questions/57077145/…

标签: r string-matching


【解决方案1】:

这是一个很棒的谜题。回答 - 诊断问题,charToRaw() 就是答案。

> charToRaw(q)
 [1] 31 39 33 31 c2 a0 38 30 74 68 c2 a0 41 6e 6e 69 76 65
[19] 72 73 61 72 79
> charToRaw(z)
 [1] 31 39 33 31 20 38 30 74 68 20 41 6e 6e 69 76 65 72 73
[19] 61 72 79

哦!不同的!它似乎在于编码,鉴于这些都是我加载的普通 ole' CSV,我永远不会猜到,但是

> Encoding(q)
[1] "UTF-8"
> Encoding(z)
[1] "unknown"

最后,我在 q 上使用了iconv() 使其工作

> iconv(q, from = 'UTF-8', to = 'ASCII//TRANSLIT') == z
[1] TRUE

这是一段奇怪的旅程,我希望这可以帮助像我一样困惑的其他人 - 他们在此过程中学习了一些新功能。

【讨论】:

    【解决方案2】:

    您的字符串中似乎有不间断的空格,这并不是真正的编码问题。这一直发生在我身上,因为 alt + space 在 Mac 上插入了一个不间断的空格,我在德语键盘上也使用 alt 来输入各种特殊字符。我的小指是我最慢的手指,当我从某个特殊字符过渡到空格时,它们并不总是足够快地释放 alt。我在编写 bash 脚本时发现了这个问题,其中<command> | <command> 很常见,| 是 alt + 7。

    我认为stringr::str_replace_all(q, "\\s", " ") 应该可以解决您当前的问题。或者,您可以尝试定位特定的不可打印内容,例如在您的情况下stringr::str_replace_all(q, "\uA0", " ")。要公开违规字符,您可以使用stringi::stri_escape_unicode(q),这将返回"1931\\u00a080th\\u00a0Anniversary"。然后,您只需复制和粘贴即可获得与上述相同的结果:stringr::str_replace_all(q, "\u00a0", " ")

    【讨论】:

    • 是的。这就对了。我喜欢你的解决方案!奇怪的是,这是因为我直接从 Rstudio 中的 View() 复制粘贴 - 这使得所有间隔都不会中断!哈!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2017-12-05
    • 2015-03-23
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多