【发布时间】: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