2012-07-06 11 views

Respuesta

12

La función aggregate debería ayudar en encontrar una solución:

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 

O bien, solo asegúrese de agregar stringsAsFactors = FALSE cuando cree su marco de datos y estará listo para comenzar. Si sus datos ya se tienen en cuenta, puede usar algo como dat[c(1, 2)] = apply(dat[-3], 2, as.character) para convertirlos a caracteres en primer lugar, a continuación:

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

¡Gracias esto funciona! –

+0

@HarryPalmer, no estoy seguro de entender su pregunta de seguimiento. Suponiendo que haya asignado la salida de 'aggregate' a otro objeto, diga' temp', 'temp $ title' sería una lista (como esta' list ('0' = c (" title1 "," title3 "),' 1' = "title2") '. Las columnas' title' y 'author' en este ejemplo son listas. ¿Es eso lo que estabas buscando? – A5C1D2H2I1M1N2O1R2T1

+0

Hmm Creo que lo entiendo gracias. Estaba confundido acerca de los tipos de datos. más pregunta por favor: ¿Cómo puedo eliminar los duplicados que aparecen en un elemento de lista de columna/fila después de la agregación? Intenté data1 <- unique (data2 $ title) pero curiosamente no funcionó. –

1

Quizás no sea la mejor solución, pero fácil de entender:

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

Bueno, pero R tiene algunas funciones incorporadas para trabajar con datos agrupados. Lo mejor para este caso es 'agregado (df [-3], by = list (df $ id), c)', pero 'by (df [-3], df $ id, c)' también le da el mismo resultado, solo en un formato totalmente diferente. – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab: thx, no uso dataframes muy a menudo y no conocía la función 'aggregate'. – sgibb

Cuestiones relacionadas