使用for循环和if函数来创建一个新的向量?
Use for-loop and if function to create a new vector?
我想用代码做以下操作:我想从给定的正态分布中获取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")
}
}
您应该避免在循环中更改迭代器 (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")
}
}
我觉得重新分配 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)
我想用代码做以下操作:我想从给定的正态分布中获取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")
}
}
您应该避免在循环中更改迭代器 (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")
}
}
我觉得重新分配 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)