В R 2.15.0
и data.table 1.8.9
:
d = data.table(a = 1:5, value = 2:6, key = "a")
d[J(3), value]
# a value
# 3 4
d[J(3)][, value]
# 4
Я ожидал, что оба будут производить тот же результат (второй), и я считаю, что они должны.
В интересах выяснения того, что это не проблема синтаксиса J
, такое же ожидание относится к следующим (идентичным выше) выражениям:
t = data.table(a = 3, key = "a")
d[t, value]
d[t][, value]
Я бы ожидал, что оба из них вернут тот же результат.
Итак, позвольте мне перефразировать вопрос - почему (data.table
сконструирован так, чтобы) ключевой столбец автоматически распечатывался в d[t, value]
?
Обновление (на основе ответов и комментариев ниже): Спасибо @Arun и др., я понимаю дизайн - почему сейчас. Причина, по которой выше выдает ключ, заключается в том, что каждый раз, когда вы выполняете слияние data.table
с помощью синтаксиса X[Y]
, существует скрытая информация, а by
- ключ. Причина, по которой он сконструирован таким образом, выглядит следующим образом: поскольку операция by
должна выполняться при слиянии, можно также воспользоваться этим и не делать другого by
, если вы собираетесь сделать это с помощью ключа слияния.
Теперь, когда я сказал, я считаю, что недостаток дизайна синтаксиса. То, как я читаю синтаксис data.table
d[i, j, by = b]
, это
возьмите
d
, примените операциюi
(будь то подмножество или слияние или что-то еще), а затем выполните выражениеJ
"на" b
Пошаговое разрывы этого чтения и вводятся случаи, о которых нужно думать конкретно (я слияния на i
, by
просто ключ слияния и т.д.). Я считаю, что это должно быть задачей data.table
- похвальное усилие сделать data.table
быстрее в одном конкретном случае слияния, когда by
равен ключу, должно выполняться альтернативным способом (например, путем проверки внутри, если выражение by
фактически является ключом слияния).