这是我的第一篇文章。如果我的问题愚蠢,请提前道歉。我是编程新手。
好的,我在R中有一个matrix(eBpvalues)
,它有152720行和2列。
我想分成10个单独的矩阵,每个矩阵包含15272行。
我试过这个:
> newmx <-split(as.data.frame(eBpvalues), rep(1:10, each = 15272)))
> summary(newmx)
Length Class Mode
1 2 data.frame list
2 2 data.frame list
3 2 data.frame list
4 2 data.frame list
5 2 data.frame list
6 2 data.frame list
7 2 data.frame list
8 2 data.frame list
9 2 data.frame list
10 2 data.frame list
我如何并排连接这些矩阵,所以我有一个包含20列和15272行的新矩阵?
干杯,
尼尔
答案 0 :(得分:9)
你快到了。在这些情况下经常使用的函数是do.call
,它接受您要应用的函数和要应用它的数据列表。您要应用的函数是cbind
到列将10个数据帧/矩阵绑定在一起。
从字面上看,我们从适当大小的矩阵mat
(Q中的eBpvalues
)开始。转换为数据框:
mat <- matrix(rnorm(152720 * 2), ncol = 2)
df <- data.frame(mat)
生成指标因子的简便方法是通过gl()
函数:
ind <- gl(10, 15272)
然后我们进行了split()
来电:
newMat <- split(df, ind)
最后一步是这样,我们do.call()
将cbind()
应用于newMat
中的数据框集:
res <- do.call(cbind, newMat)
这给了我们你想要的东西(虽然你可能需要整理列名等)。
> str(res)
'data.frame': 15272 obs. of 20 variables:
$ 1.X1 : num -0.268 -0.8568 -0.0267 1.0894 1.5847 ...
$ 1.X2 : num 0.71 -0.298 0.359 0.97 -2.158 ...
$ 2.X1 : num -0.987 -0.222 2.991 0.443 0.228 ...
$ 2.X2 : num -2.343 -1.023 -1.48 1.47 0.758 ...
$ 3.X1 : num -0.305 -0.761 0.817 1.347 0.694 ...
$ 3.X2 : num -0.0915 0.4816 1.4662 -1.2668 -1.3523 ...
$ 4.X1 : num -0.678 -1.056 1.029 -0.468 0.836 ...
$ 4.X2 : num -0.656 -0.459 -0.965 -1.666 0.877 ...
$ 5.X1 : num -0.295 -1.255 1.395 -1.985 -1.71 ...
$ 5.X2 : num 1.141 1.177 -1.003 -0.29 -0.234 ...
$ 6.X1 : num -0.0548 1.8673 -1.5388 -1.1063 0.3923 ...
$ 6.X2 : num -1.399 0.57 0.367 -0.811 -2.434 ...
$ 7.X1 : num 0.389 -1.058 0.61 1.102 -0.063 ...
$ 7.X2 : num 0.854 1.251 1.095 -0.485 0.451 ...
$ 8.X1 : num -2.018 0.849 0.3 0.988 -1.993 ...
$ 8.X2 : num -1.23 -1.025 -0.546 1.674 0.588 ...
$ 9.X1 : num 0.814 0.726 1.04 0.985 1.781 ...
$ 9.X2 : num -1.094 -1.051 0.749 1.426 0.402 ...
$ 10.X1: num 0.3786 1.6131 -0.4149 0.0684 -0.815 ...
$ 10.X2: num 0.383 -0.136 -0.751 -0.164 0.434 ...
答案 1 :(得分:4)
使用索引,您可以在不使用split命令的情况下轻松执行此操作,使用R按列填充矩阵的事实。
玩具示例:
> eBpvalues <- matrix(1:100,ncol=2) # a matrix with 2 cols and 50 values
> id <- c(1,11)+rep(0:9,each=2)
> id
[1] 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19 10 20
> tt <- matrix(eBpvalues,ncol=20)[,id]
> tt # a matrix with the 2 cols split up and binded rowwise
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,] 1 51 6 56 11 61 16 66 21 71 26 76 31 81 36 86 41 91 46 96
[2,] 2 52 7 57 12 62 17 67 22 72 27 77 32 82 37 87 42 92 47 97
[3,] 3 53 8 58 13 63 18 68 23 73 28 78 33 83 38 88 43 93 48 98
[4,] 4 54 9 59 14 64 19 69 24 74 29 79 34 84 39 89 44 94 49 99
[5,] 5 55 10 60 15 65 20 70 25 75 30 80 35 85 40 90 45 95 50 100
这再次给你一个矩阵。如果使用split,则可以使用Gavin的解决方案。这会将所有内容转换为数据帧,这可能会产生不必要的副作用。一开始就在大型矩阵上慢一点。