在数据框中按组来折叠文本
如何在列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
如果你有一个大的数据集, ddply
比aggregate
速度快。
编辑 :从@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=''))