2011-01-21 2 views
13

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

Я пытаюсь использовать 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 

UPDA TE ... Для уточнения функциональности я искал в приведенном выше примере: мне нужно сделать эквивалент следующее:

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

Однако в соответствии с приведенной ниже выписки из data.table FAQ, это должно работали :

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

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

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

+0

Но вы спросили какое-то время назад, и он был рассмотрен v1.5.3 выпущен в CRAN в феврале 2011 года. См. Его НОВОСТИ, новые данные.table и исправленные FAQ. –

+0

@Matthew спасибо, да, я знаю, что он был рассмотрен в последней версии, и я рад, что вы указали это здесь, так что это ясно для других. –

ответ

4

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

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

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

> 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) 

Таким образом, только дополнительный столбец был добавлен к каждому data.table. Давайте посмотрим 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)]. Для того, чтобы вычислить одну колонку data.table из xy$foo * xy$boo, следующее может работать:

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

Ну, результат не data.table, но вектор вместо этого.


Update (29.03.2012): спасибо @David за указание моего внимания на то, что merge.data.table были использованы в приведенных выше примерах.

+0

Ссылаясь на пример в моем вопросе, я хочу сделать объединение 'x' и' y', назовем его 'xy', а затем создадим кадровый кадр с одним столбцом, который равен' xy $ foo * ху $ boo'. –

+0

@Prasad Chalasani: Я отредактировал свой ответ, надеюсь, вы сможете найти в нем что-то новое и ценное. – daroczig

+0

спасибо за подробности, но мой вопрос был о том, почему конкретный синтаксис, который я описываю в моем вопросе, не работает, вопреки тому, что он говорит в FAQ. Я знаю, что могу сделать это в два этапа (слияние, а затем работать с столбцами), но я хочу, чтобы синтаксис 'x [y, ] работал за один шаг * - то есть, соединение и работа на' x' и 'y' за один шаг. Это синтаксически менее утомительно и, возможно, быстрее (если оно реализовано правильно внутри). Я имею дело с 10-миллионными кадрами данных, поэтому меня не интересуют тайминги маленького примера игрушек выше. –

Смежные вопросы