便宜的解决方案
由于DNase data.frame 已经按Run 因子排序,我们实际上可以通过简单调用matrix() 来形成所需的输出矩阵:
matrix(DNase$density,16);
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
## [1,] 0.017 0.045 0.070 0.011 0.035 0.086 0.094 0.054 0.032 0.052 0.047
## [2,] 0.018 0.050 0.068 0.016 0.035 0.103 0.092 0.054 0.043 0.094 0.057
## [3,] 0.121 0.137 0.173 0.118 0.132 0.191 0.182 0.152 0.142 0.164 0.159
## [4,] 0.124 0.123 0.165 0.108 0.135 0.189 0.182 0.148 0.155 0.166 0.155
## [5,] 0.206 0.225 0.277 0.200 0.224 0.272 0.282 0.226 0.239 0.259 0.246
## [6,] 0.215 0.207 0.248 0.206 0.220 0.277 0.273 0.222 0.242 0.256 0.252
## [7,] 0.377 0.401 0.434 0.364 0.385 0.440 0.444 0.392 0.420 0.439 0.427
## [8,] 0.374 0.383 0.426 0.360 0.390 0.426 0.439 0.383 0.395 0.439 0.411
## [9,] 0.614 0.672 0.703 0.620 0.658 0.686 0.686 0.658 0.624 0.690 0.704
## [10,] 0.609 0.681 0.689 0.640 0.647 0.676 0.668 0.644 0.705 0.701 0.684
## [11,] 1.019 1.116 1.067 0.979 1.060 1.062 1.052 1.043 1.046 1.042 0.994
## [12,] 1.001 1.078 1.077 0.973 1.031 1.072 1.035 1.002 1.026 1.075 0.980
## [13,] 1.334 1.554 1.629 1.424 1.425 1.424 1.409 1.466 1.398 1.340 1.421
## [14,] 1.364 1.526 1.479 1.399 1.409 1.459 1.392 1.381 1.405 1.406 1.385
## [15,] 1.730 1.932 2.003 1.740 1.750 1.768 1.759 1.743 1.693 1.699 1.715
## [16,] 1.710 1.914 1.884 1.732 1.738 1.806 1.739 1.724 1.729 1.708 1.721
这当然取决于前面提到的排序,可以通过调用rle()来验证:
do.call(data.frame,rle(levels(DNase$Run)[DNase$Run]));
## lengths values
## 1 16 1
## 2 16 2
## 3 16 3
## 4 16 4
## 5 16 5
## 6 16 6
## 7 16 7
## 8 16 8
## 9 16 9
## 10 16 10
## 11 16 11
稳健的解决方案
如果我们不想依赖该排序,我们可以使用reshape(),如下所示,如果您想要的话,我们会得到一个不错的列名奖励:
reshape(cbind(DNase[c('Run','density')],id=ave(c(DNase$Run),DNase$Run,FUN=seq_along)),dir='w',timevar='Run')[-1];
## density.1 density.2 density.3 density.4 density.5 density.6 density.7 density.8 density.9 density.10 density.11
## 1 0.017 0.045 0.070 0.011 0.035 0.086 0.094 0.054 0.032 0.052 0.047
## 2 0.018 0.050 0.068 0.016 0.035 0.103 0.092 0.054 0.043 0.094 0.057
## 3 0.121 0.137 0.173 0.118 0.132 0.191 0.182 0.152 0.142 0.164 0.159
## 4 0.124 0.123 0.165 0.108 0.135 0.189 0.182 0.148 0.155 0.166 0.155
## 5 0.206 0.225 0.277 0.200 0.224 0.272 0.282 0.226 0.239 0.259 0.246
## 6 0.215 0.207 0.248 0.206 0.220 0.277 0.273 0.222 0.242 0.256 0.252
## 7 0.377 0.401 0.434 0.364 0.385 0.440 0.444 0.392 0.420 0.439 0.427
## 8 0.374 0.383 0.426 0.360 0.390 0.426 0.439 0.383 0.395 0.439 0.411
## 9 0.614 0.672 0.703 0.620 0.658 0.686 0.686 0.658 0.624 0.690 0.704
## 10 0.609 0.681 0.689 0.640 0.647 0.676 0.668 0.644 0.705 0.701 0.684
## 11 1.019 1.116 1.067 0.979 1.060 1.062 1.052 1.043 1.046 1.042 0.994
## 12 1.001 1.078 1.077 0.973 1.031 1.072 1.035 1.002 1.026 1.075 0.980
## 13 1.334 1.554 1.629 1.424 1.425 1.424 1.409 1.466 1.398 1.340 1.421
## 14 1.364 1.526 1.479 1.399 1.409 1.459 1.392 1.381 1.405 1.406 1.385
## 15 1.730 1.932 2.003 1.740 1.750 1.768 1.759 1.743 1.693 1.699 1.715
## 16 1.710 1.914 1.884 1.732 1.738 1.806 1.739 1.724 1.729 1.708 1.721
请注意,从技术上讲,上述对象是一个 data.frame,但您可以使用 as.matrix() 轻松强制转换为矩阵。
您的错误说明
您的代码失败的原因如下。首先,注意DNase$Run 向量实际上是一个有序因子:
class(DNase$Run);
## [1] "ordered" "factor"
因此,您的 A 变量也将是一个有序因子,仅具有来自 DNase$Run 的唯一值。
现在,当您使用 for 循环迭代因子(有序或其他)时,它使用级别(字符串)作为迭代值(与内部存储的整数枚举值相反)。演示:
for (i in factor(letters[1:5])) print(i);
## [1] "a"
## [1] "b"
## [1] "c"
## [1] "d"
## [1] "e"
因此,您的i 循环变量被分配给DNase$Run 的级别字符串。而且,由于您的 z 矩阵没有 dimnames,因此尝试使用字符串对其列进行索引会失败,并显示错误消息“数组没有 'dimnames' 属性”。