我正在嘗試使用 for 回圈模擬資料并將其存盤在一些矩陣中,代碼如下:
m <- matrix(nrow = 500 , ncol = 7)
for(i in seq(from = 1, to = 4, by = 0.5)){
a <- 1 * i rnorm(n = 500, mean = 0, sd = 1)
m[, i] <- a
}
但不是給我 7 列,其平均值約為 1、1.5、2、2.5、3、3.5 和 4。矩陣 m 包含 4 列,平均值約為 1.5、2.5、3.5 和 4 和 3 列的 NA 值。
如果我將增量??更改為 1 并運行以下代碼,一切都會按預期運行,因此問題似乎與增量有關,但我無法弄清楚我應該做些什么不同的事情,我們將不勝感激。
m <- matrix(nrow = 500 , ncol = 7)
for(i in seq(from = 1, to = 7, by = 1)){
a <- 1 * i rnorm(n = 500, mean = 0, sd = 1)
m[, i] <- a
}
uj5u.com熱心網友回復:
列索引必須是整數。在您的情況下,您嘗試選擇1.5不可能的列。您可以通過一些簡單的計算來解決這個問題 ( (i * 2) - 1)
# reduce number of rows for showcase
n <- 100
m <- matrix(nrow = n , ncol = 7)
for(i in seq(from = 1, to = 4, by = 0.5)){
# NOTE: 1*i does not change anything
a <- 1*i rnorm(n = n, mean = 0, sd = 1)
# make column index integerish
m[, (i * 2) - 1] <- a
}
m[1:5, ]
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#> [1,] 1.15699467 0.8917952 1.999899 2.330557 4.502607 4.469957 5.687460
#> [2,] -1.13634309 1.5394771 1.700148 1.669329 2.124019 3.472836 3.513351
#> [3,] 2.08584731 1.0591743 2.866186 3.192953 3.984286 3.593902 3.983265
#> [4,] 0.02211767 2.2222376 2.055832 2.927851 2.846376 3.411725 3.742966
#> [5,] 0.49167319 2.2244472 2.190050 3.525931 2.841522 5.722172 4.797856
colMeans(m)
#> [1] 0.8537568 1.6805235 1.9907633 2.6434843 2.8651140 3.5499583 3.9757984
uj5u.com熱心網友回復:
當您使用rnorm時,它實際上允許對平均值進行矢量化輸入,因此您可以嘗試下面的代碼(但您應該使用matrix將獲得的輸出擬合到輸出矩陣的所需維度)
nr <- 500
nc <- 7
m <- t(matrix(rnorm(nr * nc, seq(1, 4, 0.5), 1), nc, nr))
例如,您可以在哪里看到
> m[1:5, ]
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 3.2157776 0.3805689 0.7550255 2.508356 3.567479 2.597378 4.122201
[2,] 0.8634009 0.4887092 2.5655513 1.710756 2.377790 3.733045 4.199812
[3,] -0.1786419 2.4471083 1.2138140 3.090687 2.763694 3.471715 4.676037
[4,] 1.2492511 2.3480447 2.2180039 1.965656 1.505342 3.832380 4.086075
[5,] -0.1301543 1.7463687 1.2467769 2.649525 4.795677 2.606623 4.318468
> colMeans(m)
[1] 0.901146 1.476423 1.900147 2.567463 2.996918 3.468140 4.025929
uj5u.com熱心網友回復:
您正在i用作行索引,但i具有非整數值。只有整數可以用于索引矩陣/df。例如,當i是 1.5 但您嘗試在m[,i]運算式中使用它時,它會被強制為整數并向下舍入為 1,因此回圈的前 2 次運行會相互覆寫(以及第 3 次和第 4 次等)。
您可以簡單地使用您的第二個代碼并替換1*i為0.5 0.5*i:
m <- matrix(nrow = 5000 , ncol = 7)
for(i in seq(from = 1, to = 7, by = 1)){
a <- 0.5 0.5*i rnorm(n = 5000, mean = 0, sd = 1)
m[,i] <- a
}
但是,使用函式的引數生成具有指定均值/標準差的值可能會更好rnorm:目前,您正在從以 0 為中心的正態分布中繪制,然后將其橫向移動;你可以簡單地告訴它使用你真正想要的平均值。
m <- matrix(nrow = 5000 , ncol = 7)
for(i in seq(from = 1, to = 7, by = 1)){
m[,i] <- rnorm(n = 5000, mean = 0.5 0.5*i, sd = 1)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/505234.html
