【问题标题】:unique.data.table do not handle keys properlyunique.data.table 不能正确处理键
【发布时间】: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

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-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


【解决方案1】:

有了this recent commit,data.table 现在通过在创建data.tables 时确保正确的编码以及在unique()duplicated() 等函数中确保正确的编码来隐式处理这些混合编码。

请参阅README.md 中 v1.9.7 的错误下的新闻项 (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

【讨论】:

    【解决方案2】:

    正如 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'))] 强制字符进行本机编码,但这对我来说似乎有些牵强。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      相关资源
      最近更新 更多