2016-09-22 56 views
3

即使編碼未混合且已知,數據表也會發出警告。合併不發出任何警告的唯一時間是編碼設置爲未知的兩個。這似乎並不正確,邏輯比較似乎採取不同的行動並忽略編碼。非英文環境中的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 
+0

我無法複製它。我得到'「UTF-8」「UTF-8」',而不是拉丁文,並且它合併得很好。使用1.9.7。 – jangorecki

+0

也許兩種不同的環境和1.9.7?當你有「未知」和「UTF-8」時,它會融合得很好嗎? – ErrantBard

回答

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-設置)。從1.9.8開始,它應該可以正常工作。

所以現在應該解決這個問題。