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)
任何意见表示赞赏,谢谢.
'test'数据中的'y'列是a factor(由@BondedDust提到),因为data.framecall中的默认设置是stringsAsFactors=TRUE.因此,它不转换character到factor.如果我们使用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)