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

StackOverflow https://stackoverflow.com/questions/4764434

  •  16-10-2019
  •  | 
  •  

Вопрос

ОБНОВИТЬ: Старый вопрос ... он был разрешен с помощью 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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Здесь вы возвращаете колонны у умножен на а колонна Икс. Анкет Если вы хотите получить ИксS. Фу умножается на уS. бу, пытаться:

> 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 были использованы в приведенных выше примерах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top