【发布时间】:2014-06-06 15:48:50
【问题描述】:
我有这个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-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
【问题讨论】:
-
Encoding(A$gade)混合了“UTF-8”和“unknown”。 -
经过调查,奇怪的编码来自于函数
str_replace()(包stringr)应用于unkown编码的字符向量。实际上,所有包含外来字符(如 æ、ø 或 å...是的,我在丹麦工作)的字段都转换为 UTF-8。
标签: r key unique data.table