2014-07-07 266 views
-1

我想在for循環中構造一個矩陣。我聲明我的代碼中的空白矩陣稱爲矩陣1,我試圖填補這行方向與模擬的x,y和z變量:for循環矩陣構造

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

'cbind'用於添加列。我想你想使用'rbind'而不是 – Barranka

+0

我的意思是(如果這不清楚),我希望將x,y,z添加到1行,然後在下一次迭代中將x,y,z添加到下面一排。因此,CBIN是有意義的。 – user3810226

回答

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] = ... 
    } 
} 
+0

其實我想通了!矩陣1 < - cbind(x,y,z)是唯一需要做的改變,然後工作正常,這是我的一個想法。正如我在前面的評論中提到的那樣,我的意思是(如果不清楚的話,對不起),是我想把x,y,z加到1行,然後在下一次迭代時把x,y,z加到follwing行。因此,cbind是有意義的(並且顯然是有效的)。 – user3810226