即使编码未混合且已知,数据表也会发出警告。合并不发出任何警告的唯一时间是编码设置为未知的两个。这似乎并不正确,逻辑比较似乎采取不同的行动并忽略编码。非英文环境中的Data.table,逻辑比较和编码错误/错误
我有两个问题,为什么数据表在这两种编码已知且相同时都有这种行为。我想这是警告(虽然很小)的基础上的错误?
最后的合并,失败可能是期望的行为,但不应该那么逻辑比较也失败?这让我想到了第二个问题,因为在我上一次合并时它们给出了不同的结果,所以data.table连接和逻辑比较有什么区别?
面对编码问题,逻辑比较似乎更稳健。
下面的代码和可重新产生的输出。低于此值的sessionInfo()
。
library("data.table")
d.tst <- data.table(Nr = c("ÅÄÖ", "ÄÖR"))
d.tst2 <- data.table(Nr2 = c("ÅÄÖ", "ÄÖR"),
Dat = c(1, 2))
Encoding(d.tst$Nr)
# [1] "latin1" "latin1"
Encoding(d.tst2$Nr2)
# [1] "latin1" "latin1"
d.tst[1]$Nr == d.tst2[1]$Nr2
# [1] TRUE
a <- merge(d.tst, d.tst2, all.x=TRUE, by.x = "Nr", by.y = "Nr2")
警告消息: 在
bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch,
: 一种已知的编码在一个连接列中检测到(或latin1的UTF-8)。 data.table比较当前的字节,所以不支持混合 编码不好;即使用latin1和UTF-8,或者如果任何未知的编码是非ASCII的,并且其中一些被标记为已知,而另一些则不被标记。 但是,如果latin1或UTF-8专用,并且所有未知的 编码都是ASCII码,那么结果应该没问题。将来我们会为您检查 ,如果一切正常,请避免此警告。棘手的部分是 这样做不会影响ascii-only情况下的性能。
d.tst$Nr <- iconv(d.tst$Nr, "LATIN1", "UTF-8")
d.tst2$Nr2 <- iconv(d.tst2$Nr2, "LATIN1", "UTF-8")
Encoding(d.tst$Nr)
# [1] "UTF-8" "UTF-8"
Encoding(d.tst2$Nr2)
# [1] "UTF-8" "UTF-8"
a <- merge(d.tst, d.tst2, all.x=TRUE, by.x = "Nr", by.y = "Nr2")
警告消息: 在
bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch,
: 一种已知的编码在一个连接列中检测到(或latin1的UTF-8)。 data.table比较当前的字节,所以不支持混合 编码不好;即使用latin1和UTF-8,或者如果任何未知的编码是非ASCII的,并且其中一些被标记为已知,而另一些则不被标记。 但是,如果latin1或UTF-8专用,并且所有未知的 编码都是ASCII码,那么结果应该没问题。将来我们会为您检查 ,如果一切正常,请避免此警告。棘手的部分是 这样做不会影响ascii-only情况下的性能。
d.tst$Nr <- iconv(d.tst$Nr, "UTF-8", "cp1252")
d.tst2$Nr2 <- iconv(d.tst2$Nr2, "UTF-8", "cp1252")
Encoding(d.tst$Nr)
# [1] "unknown" "unknown"
Encoding(d.tst2$Nr2)
# [1] "unknown" "unknown"
a <- merge(d.tst, d.tst2, all.x=TRUE, by.x = "Nr", by.y = "Nr2")
# Here we change the encoding on only one data.table
d.tst$Nr <- iconv(d.tst$Nr, "cp1252", "UTF-8")
#Check encoding
Encoding(d.tst$Nr)
# [1] "UTF-8" "UTF-8"
Encoding(d.tst2$Nr2)
# [1] "unknown" "unknown"
# Logical comparison
d.tst[1]$Nr == d.tst2[1]$Nr2
# [1] TRUE
# This merge fails completely, not just a warning, even if logic says they are the same
a <- merge(d.tst, d.tst2, all.x=TRUE, by.x = "Nr", by.y = "Nr2")
警告消息: 在
bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch,
: 一种已知的编码在一个连接列中检测到(或latin1的UTF-8)。 data.table比较当前的字节,所以不支持混合 编码不好;即,同时使用latin1和UTF-8,或者任何未知的编码是非ascii,其中一些标记已知而另一些则不是。 但是,如果latin1或UTF-8专用,并且所有未知的 编码都是ASCII码,那么结果应该没问题。将来我们会为您检查 ,如果一切正常,请避免此警告。棘手的部分是 这样做不会影响ascii-only情况下的性能。
sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
locale:
[1] LC_COLLATE=Swedish_Sweden.1252 LC_CTYPE=Swedish_Sweden.1252 LC_MONETARY=Swedish_Sweden.1252 LC_NUMERIC=C
[5] LC_TIME=Swedish_Sweden.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.9.6 RODBC_1.3-13
loaded via a namespace (and not attached):
[1] magrittr_1.5 R6_2.1.2 assertthat_0.1 DBI_0.4-1 tools_3.3.1 tibble_1.1 Rcpp_0.12.5 chron_2.3-47
我无法复制它。我得到'“UTF-8”“UTF-8”',而不是拉丁文,并且它合并得很好。使用1.9.7。 – jangorecki
也许两种不同的环境和1.9.7?当你有“未知”和“UTF-8”时,它会融合得很好吗? – ErrantBard