首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unique.data.table不能正确处理密钥

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

Stack Overflow用户
提问于 2014-06-06 15:48:50
回答 2查看 97关注 0票数 0

我有一个data.table,叫做A

代码语言:javascript
复制
    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是由komgadnum组成的。

代码语言:javascript
复制
setkey(A,kom,gad,num)

然而,unique(A)错误地返回(而且没有警告):

代码语言:javascript
复制
    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行都是错误。这似乎提供了正确的答案:

代码语言:javascript
复制
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'观测):

代码语言:javascript
复制
   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数据

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-20 21:04:22

使用最近的承诺,data.table现在通过在创建data.tables时确保正确的编码以及在unique()duplicated()等函数中确保正确的编码来隐式地处理这些混合编码。

请参阅README.md中1.9.7版本的bug下面的新闻项目(23)。

如果您面临任何进一步的问题,请进行测试并回信。

现在我明白了:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-06-11 10:52:05

正如前面提到的,这是一个混合编码的问题。实际上,使用enc2native()将列转换为唯一的编码使unique()正常工作:

代码语言:javascript
复制
A$gad2 <- enc2native(A$gad)
setkey(A,kom,gad2,num)
unique(A)

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24085906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档