Data.table,逻辑比较和编码非英语环境中的错误/错误

时间:2016-09-22 07:47:32

标签: r encoding 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比较当前的字节数,因此不支持 mixed         编码好;即,使用latin1和UTF-8,或者如果有任何未知的         编码是非ascii,其中一些是已知的,而另一些则没有。         但是如果latin1或UTF-8是专门使用的,并且都是未知的         编码是ascii,那么结果应该没问题。将来我们会检查         为你而且如果一切正常,请避免这个警告。棘手的部分是         这样做不会影响ascii案例的性能。

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比较当前的字节数,因此不支持 mixed         编码好;即,使用latin1和UTF-8,或者如果有任何未知的         编码是非ascii,其中一些是已知的,而另一些则没有。         但是如果latin1或UTF-8是专门使用的,并且都是未知的         编码是ascii,那么结果应该没问题。将来我们会检查         为你而且如果一切正常,请避免这个警告。棘手的部分是         这样做不会影响ascii案例的性能。

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比较当前的字节数,因此不支持 mixed         编码好;即,使用latin1和UTF-8,或者如果有任何未知的         编码是非ascii,其中一些是已知的,而另一些则没有。         但是如果latin1或UTF-8是专门使用的,并且都是未知的         编码是ascii,那么结果应该没问题。将来我们会检查         为你而且如果一切正常,请避免这个警告。棘手的部分是         这样做不会影响ascii案例的性能。

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

1 个答案:

答案 0 :(得分:1)

从新的data.table版本1.9.8开始,这应该是固定的。

例如:

# 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")

上面的代码在1.9.6中对我(给定我的sys-settings)失败了。从1.9.8开始,它可以正常工作。

所以现在应该解决这个问题。