Невозможно использовать запятую внутри имени столбца обратного вызова для data.table setkey?

108
8

Если у меня есть имя столбца, которое требует обратных ссылок, потому что оно содержит запятую, 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 для получения значений столбцов символов (которые будут из внешнего источника, например базы данных), и сделать их имена столбцов.


До тех пор, пока вам не нужно "присоединяться" к поведению ключа и просто нужно сортировать, тогда вы можете обойти это, скопировав таблицу или используя 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

спросил(а) 2013-10-03T13:16:00+04:00 7 лет, 1 месяц назад
1
Решение
92

ОБНОВЛЕНИЕ (eddi): По сравнению с версия 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?

ответил(а) 2013-10-03T21:14:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема