Как сделать, data.table объединяет операцию

примечание: этот вопрос и следующие ответы относятся к data.table версиям <1.5.3; v. 1.5.3 был выпущен в феврале 2011 для решения этого вопроса. посмотрите более свежую обработку (03-2012): Перевод SQL присоединяется на внешних ключах к R data.table к синтаксису


Я рыл через документацию для data.table пакета (замена для data.frame, это намного более эффективно для определенных операций), включая презентацию Josh Reich SQL и data.table в Нью-Йорк Сити R Встреча (PDF), но не может понять эту полностью тривиальную операцию.

> x <- DT(a=1:3, b=2:4, key='a')
> x
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> y <- DT(a=1:3, c=c('a','b','c'), key='a')
> y
     a c
[1,] 1 a
[2,] 2 b
[3,] 3 c
> x[y]
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> merge(x,y)
  a b c
1 1 2 a
2 2 3 b
3 3 4 c

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

49
задан Community 23 May 2017 в 01:55
поделиться

3 ответа

Вы цитируете не ту часть документации. Если вы посмотрите на документ [. Data.table , вы прочитаете:

Когда i - это data.table, x должен иметь ключ , что означает соединение i с x и возвращают строки в x, соответствующие . Равное соединение выполняется между каждым столбцом в i по порядку с каждым столбцом в ключе x. Это аналогично базовым функциям R под- установка матрицы матрицей из 2 столбцов, а в более высоких измерениях подмножество n-мерного массива матрицей из n столбцов

Я допускаю описание package (часть, которую вы процитировали) несколько сбивает с толку, потому что кажется, что в нем говорится, что вместо слияния можно использовать операцию "[". Но я думаю, что в нем говорится: если x и y оба являются данными. Таблицы, мы используем соединение по индексу (которое вызывается как слияние) вместо двоичного поиска.


Еще кое-что:

В библиотеке data.table, которую я установил с помощью install.packages , отсутствовал метод merge.data.table , поэтому использование merge вызовет merge.data.frame . После установки пакета из R-Forge R использовал более быстрый метод merge.data.table .

Вы можете проверить, есть ли у вас метод merge.data.table, проверив вывод:

methods(generic.function="merge")

EDIT [Ответ больше не действителен]: Этот ответ относится к data.table версии 1.3. В версии 1.5.3 поведение data.table изменилось, и x [y] возвращает ожидаемые результаты. Спасибо Мэтью Доул , автору data.table, за указание на это в комментариях.

29
ответ дан 7 November 2019 в 11:53
поделиться

Спасибо за ответы. Я пропустил эту тему, когда она была первоначально опубликована. data.table продвинулся вперед с февраля. 1.4.1 была выпущена на CRAN некоторое время назад, а 1.5 скоро выйдет. Например, псевдоним DT() был заменен на list(); как примитив он намного быстрее, а data.table теперь наследует от data.frame, поэтому работает с пакетами, которые только принимают data.frame, такими как ggplot и lattice, без необходимости преобразования (быстрее и удобнее).

Можно ли подписаться на тег data.table, чтобы я получал письмо, когда кто-то публикует вопрос с этим тегом? Список datatable-help вырос примерно до 30-40 сообщений в месяц, но я с удовольствием отвечу и здесь, если смогу получить какое-то уведомление.

Matthew

14
ответ дан 7 November 2019 в 11:53
поделиться

Я думаю, что f3lix правильный, а документация немного вводит в заблуждение. Преимущество заключается в быстром соединении для подмножества данных. В конечном итоге вам все равно нужно будет использовать функцию merge , как в приведенном выше примере.

В презентации Джоша об использовании data.table вы увидите, что именно так работает его пример. Сначала он подбирает одну из таблиц data.tables, затем выполняет слияние:

library(data.table)
sdt <- DT(series, key='series_id')
ddt <- DT(data, key='series_id')
u <- sdt[ grepl('^[A-Z]{2}URN', fred_id) & !grepl('DSURN', fred_id) ]
d <- ddt[ u, DT(min=min(value)), by='series_id', mult='all']
data <- merge(d,series)[,c('title','min','mean','max')]
3
ответ дан 7 November 2019 в 11:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: