用于循环矩阵构造

时间:2014-07-07 17:37:48

标签: r

我正在尝试在for循环中构造一个矩阵。我在我的代码中声明一个名为matrix1的空矩阵,我试图用模拟的x,y和z变量逐行填充它:

simulation <- function(ss){
nsim <- 100
matrix1 <- matrix(0, ncol=3, nrow=nsim)
colnames(matrix1) <- c("x", "y", "z")

for(i in 1:nsim) {
set.seed(i)
x <- relevel(as.factor(sample(1:4,ss, replace=TRUE)), ref="4")
y <- relevel(as.factor(sample(1:3,ss, replace=TRUE)), ref="3")
z <- relevel(as.factor(sample(1:2,ss, replace=TRUE)), ref="2")

matrix1[i, ] <- cbind(x, y, z)
}
return(matrix1)
}

现在,当我运行它时,我收到一个错误:

Error in matrix1[i, ] <- cbind(x, y, z) : 
number of items to replace is not a multiple of replacement length

我不明白为什么会发生这种情况,因为matrix1有3列,我用3个变量x,y和z递归填充它。

1 个答案:

答案 0 :(得分:1)

逐行填充它,这样做(这样效率不高):

x = data.frame(name = character(), y = numeric())
for(i in 1:10){
   x = rbind(x, data.frame(name = letters[i], y = runif(1)))
}

#   name          y
1     a 0.09931082
2     b 0.85088120
3     c 0.39535348
4     d 0.08633770
5     e 0.08329996
6     f 0.46080032
7     g 0.39309986
8     h 0.01993358
9     i 0.96079532
10    j 0.19371701

如果你有很多行,这是非常低效的。在这种情况下,您可以尝试预分配行:

n = 10
x = data.frame(name = rep(NA_character_, n), y = rep(NA_real_, n))

   name  y
1  <NA> NA
2  <NA> NA
3  <NA> NA
4  <NA> NA
5  <NA> NA
6  <NA> NA
7  <NA> NA
8  <NA> NA
9  <NA> NA
10 <NA> NA

然后循环遍历行和列以设置值。

for (i in 1:n){
    for (j in 1:2){
        # x[i, j] = ...
    }
}