在R

时间:2016-03-31 04:00:02

标签: arrays r for-loop

我有以下问题,假设我有一个函数ss(),它产生的数据总是有4列但行数不同,我想把这个输出存储到数组中

ss(M[1])  #matrix with 4 cols and 10 rows
ss(M[2])  #matrix with 4 cols and 20 rows
ss(M[3]) #matrix with 4 cols and 40 rows

然后我想把它们放在一个数组中:

J<-array(40,4,3)
for ( i in 1:3){
J[,,i]<-ss(M[i])
}

但是,对于具有10行的第一个矩阵,重复这些值以填充数组,我希望在M中存在的数据被填充之后具有0。然后我尝试了:

J<-array(40,4,3)
for ( i in 1:3){
dims<-dim(ss(M[i]))
J[1:dims[1],1:dims[2],i]<-ss(M[i])
}

但我觉得这种方法效率不高,有没有更好的方法?有没有办法使用申请:

B<-lapply(M, ss)

但这也非常慢,(M有10000个元素)

1 个答案:

答案 0 :(得分:1)

在没有循环的情况下创建对象B的一种方法是:

B <- as.array(lapply(1:3, ss))

如果你真的想强制所有矩阵有40行,用零填充非数据元素,你可以创建一个ss()版本,它返回一个包含该行数的矩阵。如:

ss <- function(x) {
  m <- matrix(x, nrow = x*10, ncol = 4)
  rbind(m, matrix(0, nrow = 40 - nrow(m), ncol = 4))
}