我有一个矩阵列表,每个矩阵的列数相同。我想创建一个单一的数据帧,第一列从matrix1,然后第一列从matrix2,然后第一栏从matrix3…然后第二列从matrx1,然后第二栏从matrx2,等等。
counts <- data.frame(apples=round(rnorm(10, mean=5), digits=0),
oranges=round(rnorm(10, mean=5), digits=0),
pears=round(rnorm(10, mean=5), digits=0))
weights <- data.frame(apples=round(rnorm(10, mean=3), digits=1),
oranges=round(rnorm(10, mean=3), digits=1),
pears=round(rnorm(10, mean=3), digits=1))
diameters <- data.frame(apples=round(rnorm(10, mean=10), digits=1),
oranges=round(rnorm(10, mean=10), digits=1),
pears=round(rnorm(10, mean=10), digits=1))
fruitdata <- list(counts, weights, diameters)
> fruitdata
[[1]]
apples oranges pears
1 4 4 4
2 6 5 5
3 6 4 6
4 6 5 4
5 7 4 5
6 6 7 5
7 4 6 5
8 4 6 5
9 4 5 5
10 5 7 5
[[2]]
apples oranges pears
1 2.5 3.1 1.1
2 4.3 2.4 4.2
3 2.8 3.5 1.3
4 2.8 1.5 2.5
5 2.9 3.3 1.9
6 3.7 1.5 2.2
7 2.9 2.7 5.1
8 3.0 2.5 3.0
9 2.3 2.3 1.7
10 2.7 2.9 1.4
[[3]]
apples oranges pears
1 10.5 10.4 12.3
2 10.0 9.8 10.1
3 9.7 11.1 10.5
4 9.1 10.9 9.9
5 8.5 9.4 9.7
6 8.9 12.2 10.0
7 11.0 9.7 10.8
8 9.4 8.6 12.1
9 8.6 9.9 11.0
10 11.9 10.2 11.2
我想要的是这样的东西。。。
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 4 2.5 10.5 4 3.1 10.4
[2,] 6 4.3 10.0 5 2.4 9.8
[3,] 6 2.8 9.7 4 3.5 11.1
[4,] 6 2.8 9.1 5 1.5 10.9
[5,] 7 2.9 8.5 4 3.3 9.4
[6,] 6 3.7 8.9 7 1.5 12.2
[7,] 4 2.9 11.0 6 2.7 9.7
[8,] 4 3.0 9.4 6 2.5 8.6
[9,] 4 2.3 8.6 5 2.3 9.9
[10,] 5 2.7 11.9 7 2.9 10.2
我可以使用sapply从每个矩阵中提取第一列:
test1 <- sapply(fruitdata, function(x) x[,1])
> test1
[,1] [,2] [,3]
[1,] 4 2.5 10.5
[2,] 6 4.3 10.0
[3,] 6 2.8 9.7
[4,] 6 2.8 9.1
[5,] 7 2.9 8.5
[6,] 6 3.7 8.9
[7,] 4 2.9 11.0
[8,] 4 3.0 9.4
[9,] 4 2.3 8.6
[10,] 5 2.7 11.9
所以我尝试了:
test2 <- sapply(fruitdata, function(x) x[,1:ncol(fruitdata[[1]])])
但它并没有得到我想要的。
>test2
[,1] [,2] [,3]
apples Numeric,10 Numeric,10 Numeric,10
oranges Numeric,10 Numeric,10 Numeric,10
pears Numeric,10 Numeric,10 Numeric,10
当然,我可以写一个for循环来完成这项任务,但似乎我应该能够用application或plyer套件来完成,但我不太清楚如何完成。
谢谢!
EDIT:结合了rawr的聪明建议。
这是你想要的吗?
do.call(cbind, fruitdata)[order(rep(1:3, 3))]
# apples apples.1 apples.2 oranges oranges.1 oranges.2 pears pears.1 pears.2
# 1 4 3.2 10.1 6 4.9 10.0 4 2.6 10.8
# 2 6 4.3 10.0 4 4.2 8.4 4 3.7 9.4
# 3 5 2.9 9.4 4 4.4 8.7 5 5.5 9.2
# 4 6 2.8 12.6 6 1.9 10.4 5 1.9 11.0
# 5 8 3.6 9.5 6 3.8 9.7 4 3.7 8.9
# 6 4 4.3 10.1 4 2.3 9.7 5 4.1 10.5
# 7 5 2.1 10.2 4 3.2 8.7 6 0.9 10.6
# 8 4 4.2 9.8 7 5.0 10.0 5 2.0 9.2
# 9 4 4.1 10.5 6 1.8 8.2 6 3.2 9.1
# 10 6 2.4 9.3 5 3.1 8.6 4 3.6 10.5
在这里,我们只需将所有矩阵粘在一起,然后重新排列列的顺序,使它们按照您想要的方式结束。