我有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
A
由kom
,gad
和num
键入。
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==101
和gad=='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
答案 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()