在数据框中按组折叠文本[重复]

Posted

技术标签:

【中文标题】在数据框中按组折叠文本[重复]【英文标题】:Collapse text by group in data frame [duplicate] 【发布时间】:2022-01-17 23:55:39 【问题描述】:

如何在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
")

所需的输出(数据框):

group text
a     a1a2a3
b     b1b2
c     c1c2c3

现在我有:

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

这在某种程度上有效,因为它返回按组正确折叠的文本,但作为向量:

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

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

【问题讨论】:

【参考方案1】:

只需使用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 的建议下:

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:使用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

【讨论】:

使用aggregate的公式形式给出更漂亮的名称:aggregate(text ~ group, data = df, FUN = paste, collapse = "") @rawr 这是第一次编辑 非公式 aggregate 也不需要那么折磨人 - aggregate(df["text"], df["group"], paste, collapse="") 就可以了。【参考方案2】:

您可以为此使用 dplyr 包

library(dplyr)

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

【讨论】:

当您折叠所有行时,如何保留所有变量值而不仅仅是一个分配的值?

以上是关于在数据框中按组折叠文本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在具有重复行的 SQL Server 表中按组查找行号

在大熊猫DataFrame中按组删除异常值的更快方法[重复]

在 pandas 数据框中按组回归并添加带有预测值和 beta/t-stats 的列

如何在熊猫数据框中按条件累计计算几列[重复]

折叠 Pandas 数据框中的行,每列具有不同的逻辑 [重复]

按组划分的最常见值(模式)[重复]