在数据框中按组来折叠文本

如何在列group汇总数据框,并在列text折叠text

示例数据:

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

所需输出(dataframe):

 group text a a1a2a3 b b1b2 c c1c2c3 

我现在有:

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

这在一定程度上起作用,因为它返回的文本正确地按组来分解,但作为一个vector:

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

我需要一个带有group列的数据框。

只需使用aggregate

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

或与plyr

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

如果你有一个大的数据集, ddplyaggregate速度快。

编辑 :从@SeDur的build议:

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

与之前的方法相同的结果,你必须做的:

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

编辑2 :与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 

你可以使用这个dplyr包

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