【问题标题】:Join in R fails even though logical comparisons are true [closed]即使逻辑比较为真,加入 R 也会失败 [关闭]
【发布时间】:2016-09-21 06:09:55
【问题描述】:

数据很敏感,不能公布,答案将是猜测的形式,我会非常满意。

我正在尝试将较大的 data.table 与较小的数据表连接起来,并更新一些值。较小的是通过 XLConnect 从 Excel 电子表格加载的。

连接是这样的:

d.tmp2 <- left_join(d.main, d.wb, by = c("Nr" = "Nr"))

代码执行,但我没有得到任何匹配项(只有 NA:s),这很奇怪,因为这些示例行返回 TRUE(应该如此):

d.wb[1]$Nr == d.main[39]$Nr

[1] TRUE

编辑:

这个问题本身就解决了,与 R 中的连接如何处理有关。数据中的编码显示为“未知”,但仍为 UTF-8,而从 Excel 导入的数据表显式设置为 UTF-8。显然,用不同的(不是真的不同)编码进行逻辑比较是可以的,但不是连接。

使用 iconv 设置编码解决了这个问题。尽管如此,我还是不明白为什么逻辑比较和连接有这么大的不同,这对我来说毫无意义。在这里工作可能有一些我不明白的地方。

【问题讨论】:

  • 如果我们不能reproduce,那只是猜测。
  • @zx8754 是的,我知道,但我不知道如何重现它。 1) 数据很敏感,我不能公开发布 2) 数据和系统可能需要准确才能让我们重现,这是不可能的所以我很乐意接受猜测——我在猜测编码。通常是当 R 中的错​​误很奇怪时。
  • 我实际上得到了一个解决方案,如下所示。我不得不使用 iconv 在d.main 中将编码重新设置为 UTF-8,然后加入工作。我猜逻辑比较对编码不那么挑剔,而连接是? d.wb[1] 实际上返回第一行,d.wb 的 str 返回不同的列及其值以及应该返回的其余部分
  • 好吧,当data.table::merge 执行您需要的操作时,我看不到加载dplyr 以在data.tables 上进行连接的意义:对于左连接:merge(d.main, d.wb, all.x=TRUE, by.x = "Nr", by.y = "Nr") 虽然在这里您可以只需输入by="Nr",因为两个列名相同
  • +1 当然你是对的,在未来的提交中我可能会更改它,因为 dplyr-join 在该脚本中使用了很多。

标签: r join data.table dplyr sqldf


【解决方案1】:

经过 som 测试后,我找到了答案,我不得不在 d.main 中创建一个新列,再次使用 iconv 转换为 UTF-8,然后加入新变量。然后就成功了。

所以错误在于编码,但我仍然不明白为什么逻辑比较和 dplyr 的连接的结果如此不同......

【讨论】:

    【解决方案2】:

    使用 dplyr

    d.tmp2 <- left_join(d.main, d.wb, by = "Nr")
    

    以 R 为基数

    d.tmp2 <- merge(d.main, d.wb, by = "Nr")
    

    应该可以。

    【讨论】:

    • 是的,我知道 - 它应该工作,但它没有。这让我很奇怪 - 逻辑比较不如 dplyr 或基本连接敏感,我只是尝试明确设置其中一些并且效果很好(d.main[Nr == d.wb[19]$Nr, var_a : = 新值])
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多