R重新排列数据框:将一些列项放在列表中

时间:2014-05-09 18:38:10

标签: r dataframe

我有点陷入困境,可能有更好的方式来描述我想要做的事情(如果需要可以编辑)。

我所拥有的是表示某些观察结果的数据框x。我想创建一个不同的数据框y,其中我有来自x的一些变量的所有不同组合,其中一列是由x的其他变量组成的列表列表。

我已将此简化为示例,此处为 x

x <- data.frame( c(1,1,1,1,1,1,1,2,2,2), c(11:12,11:12,11:12,11:12,16,17), c(101:110))
names(x) <- c("a","b","c")

   a  b   c
1  1 11 101
2  1 12 102
3  1 11 103
4  1 12 104
5  1 11 105
6  1 12 106
7  1 11 107
8  2 12 108
9  2 16 109
10 2 17 110

这里是 y (a> b的明显组合 x ):

y <- unique(data.frame(x$a,x$b))
names(y) <- c("a","b")
row.names(y) <- NULL

  a  b
1 1 11
2 1 12
3 2 12
4 2 16
5 2 17

我想要做的是将 y 转换为:

  a  b                  c
1 1 11 101, 103, 105, 107
2 1 12      102, 104, 106
3 2 12                108
4 2 16                109 
5 2 17                110

其中&#34; c&#34;每行包含从 x 收集到列表中的c的值。

我想找到一个很好的简洁和惯用的方式来做这件事,但会满足于任何有效的事情。

1 个答案:

答案 0 :(得分:3)

这看起来很漂亮和神秘:

aggregate(c ~ a + b, x, I)
#   a  b                  c
# 1 1 11 101, 103, 105, 107
# 2 1 12      102, 104, 106
# 3 2 12                108
# 4 2 16                109
# 5 2 17                110

I功能(您也可以使用c)会在第三列中创建list。您不需要为&#34; a&#34;的独特组合创建单独的data.frame。和&#34; b&#34;。只需将它们用作aggregate中的分组变量。


当然,还有很多其他方法可以做到这一点。

此处data.table

library(data.table)
X <- as.data.table(x)
X[, list(c = list(I(c))), by = list(a, b)]