R: При использовании data.table, как мне получить столбцы y, когда я делаю x [y]?

ОБНОВЛЕНИЕ: старый вопрос... он был разрешен data.table v1.5.3 в феврале 2011 года.

Я пытаюсь использовать пакет data.table, и мне очень нравятся ускорения, которые я получаю, но я столкнулся с этой ошибкой, когда я делаю x[y, <expr>], где x и y являются "таблицами данных", с тем же ключом и <expr> содержит имена столбцов как x, так и y:

require(data.table)
x <- data.table( foo = 1:5, a = 5:1 )
y <- data.table( foo = 1:5, boo = 10:14)
setkey(x, foo)
setkey(y, foo)
> x[y, foo*boo]
Error in eval(expr, envir, enclos) : object 'boo' not found

UPDATE... Чтобы прояснить функциональность, которую я ищу в приведенном выше примере: мне нужно сделать следующее:

with(merge(x,y), foo*boo)

Однако, согласно приведенному ниже из data.table часто задаваемых вопросов, это должно сработать:

Наконец, хотя кажется, что x [y] не возвращает столбцы в y, вы можете фактически использовать столбцы из y в выражении j. Это то, что мы означает объединение наследуемой области. Почему нет просто верните союз всех столбцы от x и y, а затем запустить выражения по этому поводу? Это сводится к эффективность кода и что быстрее программировать. Когда вы пишете x [y, fooboo], data.table автоматически проверяет выражение j, чтобы увидеть, какой которые он использует. Он будет только подмножеством, или группы, только эти столбцы. Память создается только для столбцов j использует. Пусть говорят, что foo находится в x и boo находится в y (вместе с 20 другими столбцами в y). Это не x [y, fooboo] быстрее программы и быстрее запускать, чем шаг слияния, за которым следует другое подмножество шаг?

Я знаю этот вопрос, который рассматривал аналогичную проблему, но, похоже, она не была удовлетворительно решена. Кто-нибудь знает, что мне не хватает или непонимания? Спасибо.

ОБНОВЛЕНИЕ: я спросил в списке рассылки справки таблицы данных и автора пакета (Matthew Dowle) ответил, что действительно часто цитируемый FAQ неверно, поэтому синтаксис, который я использую, в настоящий момент не работает, т.е. я не могу ссылаться на столбцы y в аргументе j (т.е. втором), когда я делаю x[y,...].

Ответы

Ответ 1

Я не уверен, хорошо ли я понимаю проблему, и я также начал читать документы библиотеки data.table, но я думаю, что если вы хотите получить столбцы y, а также сделать что-то для столбцы a, вы можете попробовать что-то вроде:

> x[y,a*y]
     foo boo
[1,]   5  50
[2,]   8  44
[3,]   9  36
[4,]   8  26
[5,]   5  14

Здесь вы возвращаете столбцы y, умноженные на столбец x. Если вы хотите получить x foo, умноженное на y boo, попробуйте:

> y[,x*boo]
     foo  a
[1,]  10 50
[2,]  22 44
[3,]  36 36
[4,]  52 26
[5,]  70 14

После редактирования: благодарю вас @Prasad Chalasani, что делает вопрос более ясным для меня.

Если предпочтительным является простое объединение, тогда должно работать следующее. Я составил более сложные данные, чтобы увидеть действия глубже:

x <- data.table( foo = 1:5, a=20:24, zoo = 5:1 )
y <- data.table( foo = 1:5, b=30:34, boo = 10:14)
setkey(x, foo)
setkey(y, foo)

Таким образом, для каждой таблицы данных добавлен только дополнительный столбец. Посмотрим merge и сделаем это с помощью data.tables:

> system.time(merge(x,y))
   user  system elapsed 
  0.027   0.000   0.023 
> system.time(x[,list(y,x)])
   user  system elapsed 
  0.003   0.000   0.006 

Из которого последний выглядит намного быстрее. Результаты не идентичны, но могут использоваться одинаково (с дополнительным столбцом последнего запуска):

> merge(x,y)
     foo  a zoo  b boo
[1,]   1 20   5 30  10
[2,]   2 21   4 31  11
[3,]   3 22   3 32  12
[4,]   4 23   2 33  13
[5,]   5 24   1 34  14
> x[,list(x,y)]
     foo  a zoo foo.1  b boo
[1,]   1 20   5     1 30  10
[2,]   2 21   4     2 31  11
[3,]   3 22   3     3 32  12
[4,]   4 23   2     4 33  13
[5,]   5 24   1     5 34  14

Итак, чтобы получить xy, мы можем использовать: xy <- x[,list(x,y)]. Для вычисления одностолбцовой таблицы данных из xy$foo * xy$boo может работать следующее:

> xy[,foo*boo]
[1] 10 22 36 52 70

Ну, результат - это не таблица данных, а вектор.


Обновление (29/03/2012): спасибо за @David за то, что я обратил внимание на то, что в приведенных выше примерах были использованы merge.data.table.