对于data.table setkey,不能在反引号列名中使用逗号?

时间:2013-10-03 10:16:14

标签: r dataframe data.table reshape2

如果我的列名需要反引号,因为它包含逗号,setkey会抛出错误,说不要使用逗号。错误将我引向?setkey,但我在示例中没有看到任何提及这一点的内容。我只能解决的问题是重命名列setkey,然后重命名。

示例代码:

library(data.table)
> DT = data.table(`X, in $` = rnorm(10))
> DT
        X, in $
 1: -1.28475886
 2:  0.97789059
 3: -0.05023914
 4: -0.38133978
 5: -0.24949607
 6:  0.99213156
 7: -0.29310512
 8:  0.02840372
 9:  0.25294231
10: -0.88955013
> setkey(DT, `X, in $`)
Error in setkeyv(x, cols, verbose = verbose) : 
  Don't use comma inside quotes. Please see the examples in help('setkey')

修改:显示更可能的示例

对我来说,你遇到这个问题的主要原因是在使用reshape2 dcast获取字符列值(来自外部源,例如数据库)并将它们作为列名。 / p>

只要您不需要密钥的“加入”行为,并且只想排序,那么您可以通过复制表或使用data.frame来解决此问题。例如:

library(ggplot2)
library(reshape2)

DT = data.table(Office = rep(c("Cambridge, UK", "Cambridge, US", "London", "New York"), each = 12), Product = rep(1:12,4), Sales = rnorm(48)^2)
DF = dcast(DT, Product~Office)
DT = data.table(DF)
setkey(DT, 'Cambridge, UK')
DT = DT[order(DF$`Cambridge, UK`),]
DT

产生

> library(ggplot2)
> library(reshape2)
> 
> DT = data.table(Office = rep(c("Cambridge, UK", "Cambridge, US", "London", "New York"), each = 12), Product = rep(1:12,4), Sales = rnorm(48)^2)
> DF = dcast(DT, Product~Office)
Using Sales as value column: use value.var to override.
> DT = data.table(DF)
> setkey(DT, 'Cambridge, UK')
Error in setkeyv(x, cols, verbose = verbose) : 
  Don't use comma inside quotes. Please see the examples in help('setkey')
> DT = DT[order(DF$`Cambridge, UK`),]
> DT
    Product Cambridge, UK Cambridge, US      London    New York
 1:      12  0.0009257347  1.7183751269 0.818101229 0.002499808
 2:       1  0.0010855828  0.0889560105 0.083778108 1.451149328
 3:       2  0.0139649148  0.7385617360 0.221688602 4.771307440
 4:       5  0.0520875574  0.3389613574 0.934932759 0.127634044
 5:      10  0.0837778446  0.0598955035 0.015930174 0.715849795
 6:       9  0.0856246191  1.1303900183 1.555058058 0.367063297
 7:       6  0.1608235273  0.7147643550 0.004588596 2.995598768
 8:       8  0.4797866129  0.1783997616 0.016459971 0.497328990
 9:       4  0.5282546636  1.7011670679 0.016126768 0.024388172
10:       7  0.5655147714  0.1106522938 0.045130643 0.442473457
11:       3  0.8315246051  0.1399159784 5.792956446 1.632060601
12:      11  3.9958208033  0.0005297928 0.003282897 1.635506818

1 个答案:

答案 0 :(得分:4)

UPDATE(eddi):version 1.8.11起,此错误已得到修复,任意列名称将与setkey一起使用。


我找到了一个黑客:(1)排序和(2)settattr

示例:

mydt <- data.table(`b,ah`=c(2L,3:1),var=letters[1:4])

mydt <- mydt[order(`b,ah`)]
setattr(mydt,'sorted','b,ah')

现在,要验证它的表现良好......

key(mydt)
# [1] "b,ah"
mydt[.(2)]
#    b,ah var
# 1:    2   a
# 2:    2   c
mydt[,.N,by=`b,ah`]
#    b,ah N
# 1:    1 1
# 2:    2 2
# 3:    3 1

评论。我没有使用OP的示例,因为将数字大浮点列设置为键很奇怪(对我而言)。

谁知道这会带来什么负面影响?无论如何,我不会使用它,并同意支持逗号会很好。如果在setkeyn / setkey中造成太多混乱,可能会按列号设置setkeyv吗?