我有点陷入困境,可能有更好的方式来描述我想要做的事情(如果需要可以编辑)。
我所拥有的是表示某些观察结果的数据框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的值。
我想找到一个很好的简洁和惯用的方式来做这件事,但会满足于任何有效的事情。
答案 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)]