2014-03-31 23 views
13

如何在列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列的數據幀。

回答

19

只需使用aggregate

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

或用plyr

​​

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:隨着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 
+2

使用公式形式'聚合'提供更漂亮的名字:聚合(文本〜組,數據= df,FUN =粘貼,摺疊=「」) – SeDur

+0

@rawr這是在第一編輯 – Victorp

+0

非公式'聚合'doesn' t也需要像''aggregate(df [「text」],df [「group」],paste,collapse =「」)'這樣做也可以。 – thelatemail

8

可以使用dplyr軟件包這一

library(dplyr) 

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

當您摺疊所有行時,如何保留所有變量值而不只是一個指定的值? – richiepop2