unique.data.table不能正确处理密钥

时间:2014-06-06 15:48:50

标签: r key unique data.table

我有data.table,名为A

    kom eje               gad num     enc
 1: 101   1 A.C. Meyers Vænge   1   UTF-8
 2: 101   2 A.C. Meyers Vænge   1 unkwown
 3: 101   3 A.C. Meyers Vænge   1 unkwown
 4: 101   4 A.C. Meyers Vænge   1   UTF-8
 5: 101   5 A.C. Meyers Vænge   1 unkwown
 6: 101   6 A.C. Meyers Vænge   1   UTF-8
 7: 101   7 A.C. Meyers Vænge   1 unkwown
 8: 101   8 A.C. Meyers Vænge   1 unkwown
 9: 101   9 A.C. Meyers Vænge   1   UTF-8
10: 101  10 A.C. Meyers Vænge   1 unkwown
11: 101  11 A.C. Meyers Vænge  10 unkwown
12: 101  12 A.C. Meyers Vænge  11 unkwown
13: 101  13 A.C. Meyers Vænge  11   UTF-8
14: 101  14 A.C. Meyers Vænge 11A unkwown
15: 101  15 A.C. Meyers Vænge 11A   UTF-8
16: 101  16 A.C. Meyers Vænge 11A   UTF-8
17: 101  17 A.C. Meyers Vænge 11A unkwown
18: 101  18 A.C. Meyers Vænge 11A unkwown
19: 101  19 A.C. Meyers Vænge 11A   UTF-8
20: 101  20 A.C. Meyers Vænge 11A   UTF-8

Akomgadnum键入。

setkey(A,kom,gad,num)

但是unique(A)错误地返回(并且没有警告):

    kom eje               gad num     enc
 1: 101   1 A.C. Meyers Vænge   1   UTF-8
 2: 101   2 A.C. Meyers Vænge   1 unkwown
 3: 101   4 A.C. Meyers Vænge   1   UTF-8
 4: 101   5 A.C. Meyers Vænge   1 unkwown
 5: 101   6 A.C. Meyers Vænge   1   UTF-8
 6: 101   7 A.C. Meyers Vænge   1 unkwown
 7: 101   9 A.C. Meyers Vænge   1   UTF-8
 8: 101  10 A.C. Meyers Vænge   1 unkwown
 9: 101  11 A.C. Meyers Vænge  10 unkwown
10: 101  12 A.C. Meyers Vænge  11 unkwown
11: 101  13 A.C. Meyers Vænge  11   UTF-8
12: 101  14 A.C. Meyers Vænge 11A unkwown
13: 101  15 A.C. Meyers Vænge 11A   UTF-8
14: 101  17 A.C. Meyers Vænge 11A unkwown
15: 101  19 A.C. Meyers Vænge 11A   UTF-8

A我键入后,我希望unique只关注这些列,如unique.data.table文档中所述。显然,第1和第2行,第4行和第5行是错误。这似乎给出了正确的答案:

B <- A[.(101,'A.C. Meyers Vænge')] # warning about encoding
unique(B)
   kom               gad eje num     enc
1: 101 A.C. Meyers Vænge   9   1   UTF-8
2: 101 A.C. Meyers Vænge  11  10 unkwown
3: 101 A.C. Meyers Vænge  12  11 unkwown
4: 101 A.C. Meyers Vænge  14 11A unkwown

但它实际上是偶然的,因为B与A不同(因为A仅包含kom==101gad=='A.C. Meyers Vænge'观察,所以不应该这样):

   kom               gad eje num     enc
1: 101 A.C. Meyers Vænge   9   1   UTF-8
2: 101 A.C. Meyers Vænge  10   1 unkwown
3: 101 A.C. Meyers Vænge  11  10 unkwown
4: 101 A.C. Meyers Vænge  12  11 unkwown
5: 101 A.C. Meyers Vænge  13  11   UTF-8
6: 101 A.C. Meyers Vænge  14 11A unkwown
7: 101 A.C. Meyers Vænge  15 11A   UTF-8
8: 101 A.C. Meyers Vænge  16 11A   UTF-8

这里发生了什么?

编辑:获取A - 类似数据

A <- data.table(
     kom = rep(101L,20),
     eje = 1L:20L,
     gad = rep("A.C. Meyers Vænge",20),
     num = rep(c('1','10','11','11A'),times=c(10,1,2,7)),
     enc = sample(c('unkwown','UTF-8'), 20, replace=TRUE)
)
Encoding(A$gad) <- A$enc

2 个答案:

答案 0 :(得分:1)

正如Arun所说,这是一个混合编码问题。实际上,将列转换为enc2native()的唯一编码会使unique()正常工作:

A$gad2 <- enc2native(A$gad)
setkey(A,kom,gad2,num)
unique(A)

但是我从不想要来获取混合编码(并且从未在我的代码中指定过这样的东西)。实际上,即使在gad2上使用原生编码,A[.(101,'A.C. Meyers Vænge')]仍会发出警告!原因很简单:

Encoding(c('a','æ'))
[1] "unknown" "UTF-8"

因此,A[.(101,'A.C. Meyers Vænge')]会发出警告(以及错误答案),因为UTF-8字符串A.C. Meyers Vænge会与本机编码列gad2进行比较。有人可能会强制使用A[.(101,enc2native('A.C. Meyers Vænge'))]对字符进行本机编码,但这对我来说似乎相当牵强。

我真的不明白这种混合编码是默认的!

答案 1 :(得分:1)

使用this recent commit,data.table现在可以通过在创建data.tables时确保正确编码以及确保checkForBraintree('braintreeCompHere'); function checkForBraintree(btContainer) { var elBool = document.getElementById(btContainer).childElementCount > 0, btBool = typeof window.braintree !== 'undefined'; return elBool && btBool; } 和{{1}等函数中的正确编码来隐式处理这些混合编码}}

请参阅README.md中v1.9.7的错误下的新闻第(23)项。

如果您遇到任何进一步的问题,请测试并回复。

现在我明白了:

unique()