我正在尝试在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递归填充它。
答案 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] = ...
}
}