2012-07-06 3 views

Antwort

12

Die aggregate Funktion sollte helfen Sie bei der Suche nach einer Lösung:

dat = data.frame(title = c("title1", "title2", "title3"), 
       author = c("author1", "author2", "author3"), 
       customerID = c(1, 2, 1)) 
aggregate(dat[-3], by=list(dat$customerID), c) 
# Group.1 title author 
# 1  1 1, 3 1, 3 
# 2  2  2  2 

Oder stellen Sie einfach sicher, dass Sie stringsAsFactors = FALSE hinzufügen, wenn Sie Ihren Datenrahmen erstellen, und Sie sind ziemlich gut zu gehen. Wenn Ihre Daten bereits berücksichtigt sind, können Sie so etwas wie dat[c(1, 2)] = apply(dat[-3], 2, as.character) zu wandeln sie in Zeichen verwenden zuerst, dann:

aggregate(dat[-3], by=list(dat$customerID), c) 
# Group.1   title   author 
# 1  1 title1, title3 author1, author3 
# 2  2   title2   author2 
+0

Danke das funktioniert! –

+0

@HarryPalmer, ich bin mir nicht sicher, ob ich Ihre Follow-up-Frage verstehe. Angenommen, Sie hätten die Ausgabe von "aggregate" einem anderen Objekt zugewiesen, sagen wir "temp", wäre "temp $ title" eine Liste (wie diese 'liste (' 0' = c ("title1", "title3"), ' 1 '=" title2 ")'. Die 'title' und' author' Spalten in diesem Beispiel sind Listen. Ist das wonach Sie gesucht haben? – A5C1D2H2I1M1N2O1R2T1

+0

Hmm Ich denke ich bekomme es jetzt Danke. Ich war verwirrt über Datentypen mehr Frage bitte: Wie kann ich Dubletten entfernen, die in einem Spalten-/Zeilenlistenelement nach der Aggregation erscheinen? Ich versuchte data1 <- unique (data2 $ title), aber merkwürdigerweise hat das nicht funktioniert. –

1

Vielleicht nicht die beste Lösung, aber leicht zu verstehen:

df <- data.frame(author=LETTERS[1:5], title=LETTERS[1:5], id=c(1, 2, 1, 2, 3), stringsAsFactors=FALSE) 

uniqueIds <- unique(df$id) 

mergedDf <- df[1:length(uniqueIds),] 

for (i in seq(along=uniqueIds)) { 
    mergedDf[i, "id"] <- uniqueIds[i] 
    mergedDf[i, "author"] <- paste(df[df$id == uniqueIds[i], "author"], collapse=",") 
    mergedDf[i, "title"] <- paste(df[df$id == uniqueIds[i], "title"], collapse=",") 
} 

mergedDf 
# author title id 
#1 A,C A,C 1 
#2 B,D B,D 2 
#3  E  E 3 
+0

Gut, aber R hat einige eingebaute Funktionen für mit gruppierten Daten zu tun. Das Beste für diesen Fall ist 'aggregate (df [-3], by = Liste (df $ id), c) ', aber' by (df [-3], df $ id, c) 'gibt Ihnen auch das Gleiche Ergebnis, nur in einem ganz anderen Format. – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab: thx, ich benutze keine Datenframes sehr oft und kannte die Aggregatfunktion nicht. – sgibb

Verwandte Themen