我想用代碼做以下操作:我想從給定的正態分布中得到一個 n = 30 的樣本,并計算每個樣本的平均值。(在這一步之前,我的功能可以正常作業)。之后,我想創建一個帶有 yes 或 no 的新向量,這取決于均值是否在某個范圍內。遺憾的是代碼沒有執行這一步。我總是得到一個有 13 個元素的向量,但應該有 500 個。有什么問題?我的錯誤在哪里?
o = 13
u = 7
d = c()
for (i in 1:500){
i = rnorm(30,mean = 10,sd = 6.04)
i = mean(i)
if (i <= o & i >=u) {
d[i]=("Yes")
} else {
d[i]=("No")
}
}
uj5u.com熱心網友回復:
您應該避免i在回圈中更改迭代器 ( )的值。在您的情況下,您i正在成為一個非整數值。當您嘗試索引您的d向量時,它需要i.
考慮當我有一個向量時會發生什么
x <- 1:4
我把pi它的索引。
x[pi]
# [1] 3
您的代碼應該更像這樣:
o = 13
u = 7
d = c()
for (i in 1:500){
sample_i = rnorm(30, mean = 10, sd = 6.04)
mean_i = mean(sample_i)
if (mean_i <= o & mean_i >=u) {
d[i]=("Yes")
} else {
d[i]=("No")
}
}
如果你想改進你的代碼,這里有一些建議:
首先,避免“增長”你的結果。這對性能有影響。最好決定您的結果 ( d) 應該有多長,并將其設定為該長度。
接下來,盡量不要將迭代次數硬編碼到回圈中。熟悉seq_along和seq_len并用它們來算的迭代你。
o = 13
u = 7
d = numeric(500) # I made a change here
for (i in seq_along(d)){ # And I made a change here
sample_i = rnorm(30, mean = 10, sd = 6.04)
mean_i = mean(sample_i)
if (mean_i <= o & mean_i >=u) {
d[i]=("Yes")
} else {
d[i]=("No")
}
}
uj5u.com熱心網友回復:
重新分配 i 對我來說是個壞主意。
您確定要在 for 回圈中執行此操作嗎?如果沒有,我認為帶有交叉的矢量化解決方案(tidyverse - 在varianceexplained.org 上有很好的解釋)應該可以很好地作業?
o = 13
u = 7
crossing(trial = 1:500,
rounds = 1:30)%>%
mutate(num = rnorm(n(), mean = 10, sd = 6.04))%>%
group_by(trial)%>%
summarise(mean = mean(num))%>%
mutate(d = case_when(mean <= o & mean >= u ~ "Yes",
TRUE ~ "No"))%>%
count(d)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/364851.html
