R中聚合FUN ='c'或'list'

use*_*990 2 aggregate r list concatenation aggregate-functions

一直在寻找,但到目前为止没有运气.

这是数据框.

> 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
Run Code Online (Sandbox Code Playgroud)

正在寻找一种方法来聚合,使得具有相同x值的y被形成为列表或向量.

就像是

  x y
1 1 a,b
2 2 c,d
3 3 e,f
Run Code Online (Sandbox Code Playgroud)

尝试'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
Run Code Online (Sandbox Code Playgroud)

"list"似乎有效,但它将字符转换为因子.

> 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
Run Code Online (Sandbox Code Playgroud)

任何意见表示赞赏,谢谢.

akr*_*run 5

'test'数据中的'y'列是a factor(由@BondedDust提到),因为data.framecall中的默认设置是stringsAsFactors=TRUE.因此,它不转换characterfactor.如果我们使用stringsAsFactors=FALSE在创建data.frame时,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"
Run Code Online (Sandbox Code Playgroud)

而不是创建一个list,另一种方法将是paste字符串在一起(toString是一个包装paste(., collapse=', '))

aggregate(y~x, data = test, FUN = toString)    
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用data.table替代方法.我们将'data.frame'转换为'data.table'(setDT(test)),按'x'分组,我们list'y'元素.

library(data.table)
setDT(test)[, list(y=list(y)), by = x]
Run Code Online (Sandbox Code Playgroud)