Один ко многим с использованием ffbase в R

Я хотел бы воспроизвести следующее соединение «один ко многим» с помощью ffdf. Как лучше всего это сделать?

Ниже я привожу пример того, что я хотел бы получить, используя data.tables. Мне известно следующее описание функции merge.ffdf:

«Этот метод аналогичен слиянию в базовом пакете, но допускает только внутреннее и левое внешнее объединение. Обратите внимание, что объединение выполняется на основе ffmatch или ffdfmatch: только первый элемент в y будет добавлен к x».

Однако мне интересно, есть ли способ обойти это.

> A <- data.table(col1 = LETTERS[1:3],col2 = c("john",'harry','potter'))
> A
   col1   col2
1:    A   john
2:    B  harry
3:    C potter
> B
   col1 col2
1:    A    1
2:    A    2
3:    A    3
4:    B    4
5:    B    5
6:    B    6
7:    C    7
8:    C    8
9:    C    9
> merge(A,B,by = 'col1',all.x = T)
   col1 col2.x col2.y
1:    A   john      1
2:    A   john      2
3:    A   john      3
4:    B  harry      4
5:    B  harry      5
6:    B  harry      6
7:    C potter      7
8:    C potter      8
9:    C potter      9

Теперь с помощью ffdf:

> C <- as.ffdf(as.data.frame(unclass(A)))
> D <- as.ffdf(as.data.frame(unclass(B)))
> merge.ffdf(C,D,by = 'col1', all.x = T)

ffdf (all open) dim=c(3,3), dimorder=c(1,2) row.names=NULL
ffdf virtual mapping
       PhysicalName VirtualVmode PhysicalVmode  AsIs VirtualIsMatrix PhysicalIsMatrix
col1           col1      integer       integer FALSE           FALSE            FALSE
col2.x         col2      integer       integer FALSE           FALSE            FALSE
col2.y       col2.y       double        double FALSE           FALSE            FALSE
       PhysicalElementNo PhysicalFirstCol PhysicalLastCol PhysicalIsOpen
col1                   1                1               1           TRUE
col2.x                 2                1               1           TRUE
col2.y                 3                1               1           TRUE
ffdf data
    col1 col2.x col2.y
1 A      john   1     
2 B      harry  4     
3 C      potter 7     
> 

Обратите внимание, что результат с использованием ffdf содержит только первый элемент каждой группы. Как можно было бы получить остальное?


person dleal    schedule 19.04.2017    source источник


Ответы (1)


merge.ffdf (D, C, by = 'col1', all.x = T)

Согласно документации, merge.ffdf разрешает только внутренние соединения (все совпадающие ключи) или левые соединения (все «левые» ключи).

Я предполагаю, что он обрабатывает каждую целую строку как ключ и отбрасывает дубликаты.

person thc    schedule 19.04.2017