Comprimi il testo per gruppo nella cornice dei dati

Come aggrego i dati frame per gruppo nel gruppo di colonne e comprimo il testo nel testo della colonna?

Dati di esempio:

 df <- read.table(header=T, text=" group text a a1 a a2 a a3 b b1 b b2 c c1 c c2 c c3 ") 

Output richiesto (frame dati):

 group text a a1a2a3 b b1b2 c c1c2c3 

Adesso ho:

 sapply(unique(df$group), function(x) { paste0(df[df$group==x,"text"], collapse='') }) 

Questo funziona in una certa misura in quanto restituisce il testo correttamente collassato dal gruppo, ma come un vettore:

 [1] "a1a2a3" "b1b2" "c1c2c3" 

Ho bisogno di un frame di dati con una colonna di group come risultato.

Basta usare aggregate :

 aggregate(df$text, list(df$group), paste, collapse="") ## Group.1 x ## 1 a a1a2a3 ## 2 b b1b2 ## 3 c c1c2c3 

O con plyr

 library(plyr) ddply(df, .(group), summarize, text=paste(text, collapse="")) ## group text ## 1 a a1a2a3 ## 2 b b1b2 ## 3 c c1c2c3 

ddply è più veloce aggregate se si dispone di un set di dati di grandi dimensioni.

EDIT : con il suggerimento di @SeDur:

 aggregate(text ~ group, data = df, FUN = paste, collapse = "") ## group text ## 1 a a1a2a3 ## 2 b b1b2 ## 3 c c1c2c3 

Per lo stesso risultato con il metodo precedente devi fare:

 aggregate(x=list(text=df$text), by=list(group=df$group), paste, collapse="") 

EDIT2 : con data.table :

 library("data.table") dt <- as.data.table(df) dt[, list(text = paste(text, collapse="")), by = group] ## group text ## 1: a a1a2a3 ## 2: b b1b2 ## 3: c c1c2c3 

Puoi usare il pacchetto dplyr per questo

 library(dplyr) df %>% group_by(group) %>% summarise(text=paste(text,collapse=''))