2013-07-15 13 views
7

Ho un frame di dati che contiene un customerid e un elenco. Vorrei unire l'elenco relativo allo stesso cliente.ddply per creare l'unione di liste

library(plyr) 
subsets <- list(c("a", "d", "e"), c("a", "b", "c", "e")) 
customerids <- c(1,1) 
transactions <- data.frame(customerid = customerids,subset =I(subsets)) 
> transactions 
    customerid  subset 
1   1 a, d, e 
2   1 a, b, c, e 

Se voglio unire i sottoinsiemi con ddply, ottengo un risultato ampliato

> ddply(transactions, .(customerid), summarise, subset=Reduce(union,subset)) 
    customerid subset 
1   1 a 
2   1 d 
3   1 e 
4   1 b 
5   1 c 

mentre mi sarei aspettato tutti i risultati in 1 fila.

+1

Il passo la creazione della dataframe tiri un errore. Probabilmente lo hai creato in modo diverso e dovresti postare 'dput (transazioni)'. Non penso che i dataframes tengano molto bene gli oggetti della lista. C'è anche una nota difficoltà con gli oggetti POSIXlt nei dataframes. –

+0

infatti ho copiato un input errato (nessun operatore I), questo è fisso. – nicolas

+0

+1 per 'I' creando l'elemento list all'interno di data.frame. – agstudy

risposta

4

si può fare qualcosa di simile:

ddply(transactions, .(customerid), function(x) 
      data.frame(subset=I(list(unlist(x$subset))))) 

Edit: Non sono sicuro seguo i tuoi commenti. Ma se volete solo i valori univoci all'interno di ogni customerid per subset allora:

ddply(transactions, .(customerid), function(x) 
      data.frame(subset=I(list(unique(unlist(x$subset)))))) 
+0

buono a sapersi. ha senso quando si guarda all'implementazione di ddply – nicolas

+0

in realtà, l'unione non conserva i duplicati, quindi 'elenco' dovrebbe essere 'unico' come riferimento. Grazie ! – nicolas

+0

in realtà, questa semplice modifica sembra non essere banale ... quindi devo rimuovere il marchio. – nicolas