2016-01-24 29 views
7

Ho un grande frame di dati (1616610 righe, 255 colonne) e devo incollare insieme i valori univoci di ogni colonna in base a una chiave.Aggregazione di tutti i valori univoci di ciascuna colonna del frame di dati

Ad esempio:

> data = data.frame(a=c(1,1,1,2,2,3), 
       b=c("apples", "oranges", "apples", "apples", "apples", "grapefruit"), 
       c=c(12, 22, 22, 45, 67, 28), 
       d=c("Monday", "Monday", "Monday", "Tuesday", "Wednesday", "Tuesday")) 
> data 
    a   b c   d 
1 1  apples 12 Monday 
2 1 oranges 22 Monday 
3 1  apples 22 Monday 
4 2  apples 45 Tuesday 
5 2  apples 67 Wednesday 
6 3 grapefruit 28 Tuesday 

Ho bisogno di aggregare ogni valore univoco in ciascuna delle colonne 255, e restituire un nuovo frame di dati con separatori virgola per ogni valore univoco. Come questo:

a    b  c     d 
1 1 apples, oranges 12, 22    Monday 
2 2   apples 45, 67 Tuesday, Wednesday 
3 3  grapefruit  28   Thursday 

Ho provato using aggregate, in questo modo:

output <- aggregate(data, by=list(data$a), paste, collapse=", ") 

ma per un frame di dati questa dimensione, è stato troppo dispendio di tempo (ore), e spesso ho per uccidere il processo tutti insieme. Inoltre, questo aggregherà tutti i valori e non solo quelli unici. Qualcuno ha qualche consigli su:

1) come migliorare il tempo di questa aggregazione per grandi insiemi di dati

2) quindi ottenere i valori unici di ogni campo

BTW, questo è il mio primo post su SO, quindi grazie per la vostra pazienza.

+0

Per quelle dimensioni, probabilmente stai andando ad avere bisogno di dati ' .table'. Non sono eccezionale con la sua sintassi, ma ci sono persone che lo sono. – alistaire

+0

grazie @alistaire. Ho sentito cose buone su 'data.table' per grandi set di dati, e ho provato a lavorare con esso, ma non riesco a capire la sintassi per questo problema. – bab2155

+0

Grazie @ G.Grothendieck! Ciò ha funzionato bene – bab2155

risposta

6

Mosso dai commenti:

library(data.table) 

dt <- as.data.table(data) 
dt[, lapply(.SD, function(x) toString(unique(x))), by = a] 

dando:

a    b  c     d 
1: 1 apples, oranges 12, 22    Monday 
2: 2   apples 45, 67 Tuesday, Wednesday 
3: 3  grapefruit  28   Tuesday 
+0

grazie @G. Grothendieck. Ha funzionato alla grande – bab2155

2

Si potrebbe fare le seguenti operazioni con dplyr

func_paste <- function(x) paste(unique(x), collapse = ', ') 
data %>% 
    group_by(a) %>% 
    summarise_each(funs(func_paste)) 

##  a    b  c     d 
## (dbl)   (chr) (chr)    (chr) 
##1  1 apples, oranges 12, 22    Monday 
##2  2   apples 45, 67 Tuesday, Wednesday 
##3  3  grapefruit  28   Tuesday 
+0

In uno, 'data%>% group_by (a)%>% summarise_each (funs (paste (unique (.), Collapse = ',')))'. È più lento dell'originale 'aggregato', sebbene restituisca il risultato corretto, almeno. – alistaire

+0

@alistaire Grazie per il test e la rimozione della necessità di una funzione separata. Sarebbe difficile battere una soluzione 'data.table' per la velocità di esecuzione. – steveb

Problemi correlati