Почему data.table :: B [A] и plyr :: join (A, B) возвращают разные результаты? - PullRequest
2 голосов
/ 04 ноября 2019

У меня есть 2 таблицы данных в R

A <- data.table(a = 1:4, b = 12:15)
B <- data.table(a = 2:3, b = 13:14)

При использовании

C<-plyr::join(A,B)

возвращается

   a  b
1: 1 12
2: 2 13
3: 3 14
4: 4 15

Когда я использую

setkey(A, "a")
setkey(B, "a")
B[A]

возвращает

   a  b i.b
1: 1 NA  12
2: 2 13  13
3: 3 14  14
4: 4 NA  15

Почему у нас есть разница в результате для обеих функций? Plyr применяет левое соединение ко всем соответствующим переменным. Data.table делает то же самое правильно? Как мы можем достичь результата, который дает plyr, используя data.table?

Ответы [ 3 ]

3 голосов
/ 05 ноября 2019

Используя версию data.table>> 1.12.4, вы можете использовать on=.NATURAL (см. Новость 10 в разделе, озаглавленном data.table v1.12.4 (03 октября 2019 г.) здесь )

library(data.table) #above and incl data.table_1.12.4
A <- data.table(a = 1:4, b = 12:15)
B <- data.table(a = 2:3, b = 13:14)
B[A, on=.NATURAL]

вывод:

   a  b
1: 1 12
2: 2 13
3: 3 14
4: 4 15
3 голосов
/ 04 ноября 2019

plyr использует оба (все) столбца для объединения, data.table использует только столбец с ключом a.

Установите те же ключи,тогда результат тот же, см .:

setkeyv(A, c("a", "b"))
setkeyv(B, c("a", "b"))
B[A]
#    a  b
# 1: 1 12
# 2: 2 13
# 3: 3 14
# 4: 4 15
0 голосов
/ 04 ноября 2019

Вот еще один вариант data.table:

B[A, .(a, b = i.b)]

   a  b
1: 1 12
2: 2 13
3: 3 14
4: 4 15
...