Ho un largish data.table
con due colonne, id
e var
:combinazioni COUNT di lunghezza 2 per id
head(DT)
# id var
# 1: 1 B
# 2: 1 C
# 3: 1 A
# 4: 1 C
# 5: 2 B
# 6: 2 C
Vorrei creare una sorta di tavola incrociata che mostra quante volte differente lunghezza 2 -combinazioni di var
si sono verificati nei dati.
attesi uscita per i dati di esempio:
out
# A B C
# A 0 3 3
# B NA 1 3
# C NA NA 0
Spiegazione:
- la diagonale del conseguente Matrix/data.frame/conta data.table quante volte tutto
var
s che si è verificato per unid
erano tutti uguali (o tutti iA
oB
oC
). Nei dati di esempio,id
4 ha una sola voce e cioèB
, quindiB
-B
è 1 nel risultato desiderato. - triangolo superiore conta per quante
id
s due specificivar
s erano presenti, cioè la combinazioneA
-B
è presente in 3id
s, come sono combinazioniA
-C
eB
-C
. - Si noti che per qualsiasi
id
, una singola combinazione di duevar
s può essere solo 0 (non presente) o 1 (presente), vale a dire non voglio contarlo più volte perid
. - il triangolo inferiore del risultato può essere lasciato NA o 0 oppure potrebbe avere gli stessi valori del triangolo superiore, ma sarebbe ridondante.
(Il risultato potrebbe anche essere somministrato in-formato lungo finché è presente le informazioni pertinenti.)
sono sicuro che ci sia un modo intelligente (efficiente) del calcolo di tale, ma posso' attualmente mi avvolgo la testa.
dati del campione:
DT <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L), var = c("B", "C", "A",
"C", "B", "C", "C", "A", "B", "B", "C", "C", "C", "C", "B", "C",
"B", "A", "C", "B")), .Names = c("id", "var"), row.names = c(NA,
-20L), class = "data.frame")
library(data.table)
setDT(DT, key = "id")
Quanto grande è abbastanza grande? – Heroka
@Heroka qualche milione di file al momento, diciamo 3. –