2013-07-15 14 views
7

Ich habe einen Datenrahmen, der eine customerid und eine Liste enthält. Ich möchte diese Liste für den gleichen Kunden zusammenführen.ddply zum Erstellen der Union von Listen

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 

Wenn ich die Untergruppen mit ddply zusammenführen möchten, erhalte ich eine Folge erweitert

> 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 

während ich alle Ergebnisse in 1 Reihe erwartet hätte.

+1

Der Schritt der Datenrahmen zu schaffen wirft einen Fehler. Sie haben das wahrscheinlich anders gemacht und sollten 'dput (transactions) 'posten. Ich glaube nicht, dass Datenfelder Listenobjekte sehr gut enthalten. Es gibt eine bekannte Schwierigkeit mit POSIXlt-Objekten in Datenrahmen. –

+0

in der Tat kopierte ich eine falsche Eingabe (kein I-Operator), das ist behoben. – nicolas

+0

+1 für das 'I', das das Listenelement im data.frame erstellt. – agstudy

Antwort

4

Sie können etwas tun:

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

Edit: Ich bin nicht sicher, ich Ihre Kommentare folgen. Aber wenn Sie nur eindeutige Werte wollen in jedem customerid für subset dann:

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

gut zu wissen. macht Sinn, wenn man sich die ddply-Implementierung – nicolas

+0

tatsächlich anschaut, Union hält keine Duplikate, daher sollte 'list' als Referenz 'eindeutig' sein. Vielen Dank ! – nicolas

+0

eigentlich scheint diese einfache Änderung nicht trivial zu sein ... also muss ich die Markierung entfernen. – nicolas