#r #data.table
#r #данные.таблица
Вопрос:
Нам действительно нужно добавить J()
для выбора числового столбца?
Мы можем получить результат для символьного столбца без J()
.
library(data.table)
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)
DT["a"]
# x y v
# 1: a 1 1
# 2: a 3 2
# 3: a 6 3
setkey(DT,y)
DT["1"]
# Error in `[.data.table`(DT, "1") :
# typeof x.y (double) != typeof i.y (character)
# Is it a bug?
DT[J(1)]
# y x v
# 1: 1 a 1
# 2: 1 b 4
# 3: 1 c 7
Спасибо!
Комментарии:
1. @G.Grothendieck — Почему бы не опубликовать это в качестве ответа?
2. ОК. Перенесли это в ответы.
3. К вашему сведению, вы также можете использовать
.(1)
вместоJ(1)
.
Ответ №1:
Причина, по которой это DT[1]
не совпадает с DT[J(1)]
, заключается в том, что существуют ДВЕ разные интерпретации, которые мы могли бы захотеть:
- первая строка,
DT[1]
- все строки, для которых ключ равен
1
,DT[J(1)]
Потенциальная двусмысленность существует только в том случае, если первый аргумент является числовым, поэтому для двух ситуаций существуют два разных обозначения.
В случае символьного ключа эта потенциальная двусмысленность не возникает, поскольку символьный аргумент может означать только второй случай.
Кроме того, DT["1"]
это ошибка в коде вопроса, поскольку ключ в примере не является символом, а data.table не выполняет приведение типов здесь.