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

R 在数据框中按组折叠文本,r,R,如何在列group中按组聚合数据帧,并在列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 ") 现在我有: sapply(unique(df$group), function(x) { paste0(df[df$group==x,"text"], collapse='') }) 这在某种程度上起作用,因为它返回按组正确折叠的文本,

如何在列
group
中按组聚合数据帧,并在列
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
")
现在我有:

sapply(unique(df$group), function(x) {
  paste0(df[df$group==x,"text"], collapse='')
})
这在某种程度上起作用,因为它返回按组正确折叠的文本,但作为向量:

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

因此,我需要一个带有
列的数据框。

您可以为此使用dplyr包

library(dplyr)

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

只需使用聚合

aggregate(df$text, list(df$group), paste, collapse="")
##   Group.1      x
## 1       a a1a2a3
## 2       b   b1b2
## 3       c c1c2c3
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
或使用
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的建议:

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="")
EDIT2:带有
数据。表

aggregate(df$text, list(df$group), paste, collapse="")
##   Group.1      x
## 1       a a1a2a3
## 2       b   b1b2
## 3       c c1c2c3
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
库(“data.table”)

dt使用公式形式的
aggregate
给出了更漂亮的名称:aggregate(text~group,data=df,FUN=paste,collapse=“”)@rawr这是第一次编辑非公式形式的
aggregate
也不需要那么麻烦-
aggregate(df[“text”],df[“group”],paste,collapse=“”)
就可以了。当您折叠所有行时,如何保留所有变量值而不仅仅是一个指定值?