R语言中使用for循环与if函数创建判断向量异常问题排查
问题诊断与解决方案
你的代码核心问题是循环变量i被意外覆盖了,导致你没有用循环的索引(1到500)去给向量d赋值,反而用样本均值作为下标,这直接导致了向量长度不符合预期。
具体错误分析
看你的循环部分:
for (i in 1:500){ i = rnorm(30,mean = 10,sd = 6.04) # 这里把循环变量i替换成了样本数据 i = mean(i) # 又把i替换成了样本均值 if (i <= o & i >=u) { d[i]=("Yes") # 这里的i是样本均值,不是循环的1-500索引! } else { d[i]=("No") } }
- 原本
i是循环的计数器(从1到500),但你在循环第一行就把它重新赋值为30个随机数的向量,接着又改成样本均值。 - 当你执行
d[i] = "Yes"时,R会把浮点数类型的均值自动转为整数下标(比如均值是8.3的话,会取第8个位置)。因为你的样本均值大多落在7-13之间,所以d的长度最终被最大的均值对应的整数决定(比如13),而不是你想要的500。这就是为什么你只得到13个元素的原因。
修正后的循环写法
我们需要把循环变量i和临时存储样本/均值的变量分开,同时提前初始化向量d(避免动态增长的效率问题,也能保证长度正确):
upper = 13 lower = 7 d = character(500) # 先创建长度为500的空字符向量 for (i in 1:500){ # 用单独的变量存储样本和均值,不要覆盖循环变量i sample_data = rnorm(30, mean = 10, sd = 6.04) sample_mean = mean(sample_data) # 用循环索引i给d的对应位置赋值 if (sample_mean >= lower & sample_mean <= upper) { d[i] = "Yes" } else { d[i] = "No" } }
更简洁的向量化写法(推荐)
R的优势是向量化操作,不用循环也能高效完成这个任务,还能避免循环里的变量错误:
upper = 13 lower = 7 # 一次性生成500个样本均值 sample_means = replicate(500, mean(rnorm(30, mean = 10, sd = 6.04))) # 用ifelse快速生成Yes/No向量 d = ifelse(sample_means >= lower & sample_means <= upper, "Yes", "No")
这样生成的d就是长度为500的向量,每个元素对应一次抽样的判断结果。
内容的提问来源于stack exchange,提问作者Georgie Baul
相关产品推荐
相关产品推荐

