我有一个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-8A是由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-like数据
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发布于 2016-01-20 21:04:22
使用最近的承诺,data.table现在通过在创建data.tables时确保正确的编码以及在unique()和duplicated()等函数中确保正确的编码来隐式地处理这些混合编码。
请参阅README.md中1.9.7版本的bug下面的新闻项目(23)。
如果您面临任何进一步的问题,请进行测试并回信。
现在我明白了:
require(data.table) # v1.9.7, commit 2096+
set.seed(2L)
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
setkey(A,kom,gad,num)
> unique(A)
# kom eje gad num enc
# 1: 101 1 A.C. Meyers Vænge 1 unkwown
# 2: 101 11 A.C. Meyers Vænge 10 UTF-8
# 3: 101 12 A.C. Meyers Vænge 11 unkwown
# 4: 101 14 A.C. Meyers Vænge 11A unkwown发布于 2014-06-11 10:52:05
正如前面提到的,这是一个混合编码的问题。实际上,使用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'))]进行本机编码,但对我来说,这似乎太牵强了。
我真的不明白这种混合编码是默认的!
https://stackoverflow.com/questions/24085906
复制相似问题