R =

2015-09-20 56 views
2

FUN ='c'或'list'聚合到目前爲止四處搜尋,但沒有運氣。R =

這裏是數據框。

> test = data.frame(x = c(1,1,2,2,3,3), y = c('a','b','c','d','e','f')) 
> test 
    x y 
1 1 a 
2 1 b 
3 2 c 
4 2 d 
5 3 e 
6 3 f 

一直在尋找一種方法來聚合,使得y隨相同x值與形成爲一個列表或向量。

喜歡的東西

x y 
1 1 a,b 
2 2 c,d 
3 3 e,f 

嘗試「C」,但結果不是預期的

> aggregate(y~x, data = test, FUN = 'c') 
    x y.1 y.2 
1 1 1 2 
2 2 3 4 
3 3 5 6 

名單「似乎工作,但其轉換性格因素,儘管。

> ss = aggregate(y~x, data = test, FUN = 'list') 
> class(ss$y[1][[1]]) 
[1] "factor" 
> ss$y[1] 
$`1` 
[1] a b 
Levels: a b c d e f 

任何意見表示讚賞,謝謝。

+0

你明白'y'柱開始了作爲一個因素矢量? –

+0

謝謝你提到這一點。這對我來說是新的。 – Chen

+0

如果你想把結果保存爲一個列表,那麼只需在參數中加上= FALSE:'ss = aggregate(y〜x,data = test,FUN ='list',simplify = FALSE)' –

回答

5

在「測試」數據列「y」爲一個factor(由@BondedDust提到的)在data.frame呼叫的默認設置爲stringsAsFactors=TRUE。因此,它不會將character轉換爲factor。如果我們在創建data.frame時使用stringsAsFactors=FALSE,則class將爲character,並保持原樣。

test = data.frame(x = c(1,1,2,2,3,3), y = c('a','b','c','d','e','f'), 
      stringsAsFactors=FALSE) 
res <- aggregate(y~x, data = test, FUN = 'list') 
str(res) 
#'data.frame': 3 obs. of 2 variables: 
#$ x: num 1 2 3 
# $ y:List of 3 
# ..$ 1: chr "a" "b" 
# ..$ 2: chr "c" "d" 
# ..$ 3: chr "e" "f" 

不用創建list的,另一種方法是將paste字符串一起(toStringpaste(., collapse=', ')一個包裝)

aggregate(y~x, data = test, FUN = toString)  

或者,我們可以使用data.table作爲一種替代方法。我們將'data.frame'轉換爲'data.table'(setDT(test)),按'x'分組,我們list'y'元素。

library(data.table) 
setDT(test)[, list(y=list(y)), by = x] 
+1

謝謝,我終於明白了。 – Chen

3

下面是與基礎R單程

res <-lapply(split(test, test$x), function(xx) data.frame(x=unique(xx$x), 
    y=paste(xx$y, collapse=", "))) 
do.call(rbind, res) 
    x y 
1 1 a, b 
2 2 c, d 
3 3 e, f 
3

您可以使用nesttidyr

library(tidyr) 

nest(test, y) 

Source: local data frame [3 x 2] 
Groups: <by row> 

     x   y 
    (dbl)  (chr) 
1  1 <S3:factor> 
2  2 <S3:factor> 
3  3 <S3:factor> 

這些<S3:factor>是真正你想要的名單:

[[1]] 
[1] a b 
Levels: a b c d e f 

[[2]] 
[1] c d 
Levels: a b c d e f 

[[3]] 
[1] e f 
Levels: a b c d e f