我正在嘗試運行更復雜的模擬并將范圍復制的結果保存到資料框。我正在嘗試做的一個非常簡單的抽象是:
sim.res <- data.frame(mn1 = mn1, mn2 = mn2, rep = rep)
for (k in 1:10){
set.seed(k*8)
mn1 <- mean(rnorm(25, 1, 1))
mn2 <- mean(rnorm(25, 2, 1))
sim.res$mn1 <- mn1
sim.res$mn2 <- mn2
sim.res$rep <- k
}
輸出應該是一個包含三列的資料框,在本例中為 10 行,每個復制的結果存盤在每一行中。我得到的是第 10 次復制。我哪里錯了?
謝謝。
uj5u.com熱心網友回復:
每次迭代回圈時都會覆寫每列的整體,因為默認情況下 R 是矢量化的(在列上運行)。此外,每次迭代回圈時都無需重置種子。嘗試這樣的事情。
library(tidyverse)
set.seed(123)
lapply(
1:10,
function(k) {
data.frame(
mn1 = mean(rnorm(25, 1, 1)),
mn2 = mean(rnorm(25, 2, 1)),
rep = k
)
}
) %>%
bind_rows()
mn1 mn2 rep
1 0.9666697 2.102137 1
2 1.0102410 2.282576 2
3 0.7231910 1.769008 3
4 1.2152427 1.862371 4
5 1.1074981 1.875461 5
6 1.1727220 2.326180 6
7 0.9789770 2.025131 7
8 1.0981718 1.752828 8
9 0.9402713 1.928519 9
10 1.2714378 2.283175 10
或者,利用 n 的平均值從 N(mu, sd) 得出的事實是 N(mu, sd/sqrt(n)),
data.frame(
rep=rep(1:10),
mn1=rnorm(10, 1, sqrt(1/25)),
mn2=rnorm(10, 2, sqrt(1/25))
)
rep mn1 mn2
1 1 1.2053570 2.176493
2 2 1.1502123 2.041120
3 3 0.6981667 1.876713
4 4 0.9809705 1.853040
5 5 0.8208104 1.973639
6 6 0.5858498 2.062003
7 7 1.0300240 1.792064
8 8 0.9841577 1.963138
9 9 0.9805261 2.193453
10 10 1.0432305 1.978344
uj5u.com熱心網友回復:
在 R 中,最基本的物件仍然是一個向量,所以這根本不需要回圈。
當您設定時,sim.res$mn1 <- mn1您將 mn1 放入 data.frame,但由于 mn1 的長度僅為 1,而 sim.res 有 10 行,因此 R 重復該值 10 次并將其放入您的 data.frame 中。
此外 set.seed 只需使用一次即可重現。
set.seed(42)
sim.res <- data.frame(mn1 = replicate(10, mean(rnorm(25, 1, 1))),
mn2 = replicate(10, mean(rnorm(25, 2, 1))),
rep = 1:10)
sim.res
mn1 mn2 rep
1 1.0818928 1.934759 1
2 1.0153544 2.185476 2
3 0.9898056 1.523066 3
4 0.9132660 2.229027 4
5 1.1003520 1.754576 5
6 0.7468452 2.211500 6
7 0.8480360 2.303661 7
8 1.2965247 2.014611 8
9 0.7511059 1.801408 9
10 1.0231177 1.924155 10
replicate只是 sapply 的包裝器,使此代碼更易于遵循。
也許從技術上講這是使用回圈,但它確實看起來不像一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/356518.html
上一篇:如何按R中的多列分組?
下一篇:在閃亮的意外行為中取消組合和選擇
