примечание: этот вопрос и следующие ответы относятся к 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 полностью...
Вы цитируете не ту часть документации. Если вы посмотрите на документ [. 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, за указание на это в комментариях.
Спасибо за ответы. Я пропустил эту тему, когда она была первоначально опубликована. 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
Я думаю, что 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')]