[英]R - How to fill a matrix by columns
我正在尝试使用内置数据框的子集填充矩阵的列。 所得矩阵的尺寸应为16 x 11,每个子集的长度为16个整数。
我写了以下for循环:
A <- unique(DNase$Run)
z <- matrix(data =NA, ncol=11, nrow =16)
for (i in A) {
z[,i] <- subset(DNase$density, DNase$Run==i)
}
并且我得到以下错误:
错误[<-
( *tmp*
,,i,value = c(0.017,0.018,0.121,0.124,0.206,:数组没有'dimnames'属性
有人能解释一下混乱的根源吗?
提前谢谢了!
由于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'属性”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.