如何在列中按组聚合数据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
")
Run Code Online (Sandbox Code Playgroud)
所需输出(数据框):
group text
a a1a2a3
b b1b2
c c1c2c3
Run Code Online (Sandbox Code Playgroud)
我现在有:
sapply(unique(df$group), function(x) {
paste0(df[df$group==x,"text"], collapse='')
})
Run Code Online (Sandbox Code Playgroud)
这在某种程度上起作用,因为它返回按组正确折叠的文本,但作为向量:
[1] "a1a2a3" "b1b2" "c1c2c3"
Run Code Online (Sandbox Code Playgroud)
我需要一个带有group列的数据框.
Vic*_*orp 25
只需使用aggregate:
aggregate(df$text, list(df$group), paste, collapse="")
## Group.1 x
## 1 a a1a2a3
## 2 b b1b2
## 3 c c1c2c3
Run Code Online (Sandbox Code Playgroud)
或者 plyr
library(plyr)
ddply(df, .(group), summarize, text=paste(text, collapse=""))
## group text
## 1 a a1a2a3
## 2 b b1b2
## 3 c c1c2c3
Run Code Online (Sandbox Code Playgroud)
ddply比aggregate拥有大型数据集更快.
编辑:根据@SeDur的建议:
aggregate(text ~ group, data = df, FUN = paste, collapse = "")
## group text
## 1 a a1a2a3
## 2 b b1b2
## 3 c c1c2c3
Run Code Online (Sandbox Code Playgroud)
对于早期方法的相同结果,您必须:
aggregate(x=list(text=df$text), by=list(group=df$group), paste, collapse="")
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
Chi*_*sen 16
你可以使用dplyr包
library(dplyr)
df %>%
group_by(group) %>%
summarise(text=paste(text,collapse=''))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13458 次 |
| 最近记录: |