如何在R语言for循环中正确使用subset()计算鸢尾花数据集均值
问题解决方法:for循环计算iris分组Petal.Length均值
你的循环代码存在逻辑错误,导致每次都计算了整个数据集的均值,具体问题和修正方案如下:
错误原因
循环里的筛选条件Species==levels(Species)有问题:levels(Species)会返回iris$Species的所有水平向量(即c("setosa", "versicolor", "virginica")),R会对每一行的Species值做循环补齐对比——只要该行值匹配任意一个水平就返回TRUE,最终会选中iris的所有行,所以每次计算的都是全局均值,结果全部相同。
修正后的代码
方法1:按索引循环水平
保留你初始的向量初始化方式,修改循环内的筛选条件,每次取对应索引的物种水平:
medie <- rep(NA,3) names(medie) <- levels(iris$Species) for (i in 1:length(medie)){ # 提取当前循环对应的物种水平 current_sp <- levels(iris$Species)[i] # 筛选对应物种的行,计算Petal.Length均值 medie[i] <- mean(subset(iris, Species == current_sp)$Petal.Length) }
方法2:直接循环物种水平(更直观)
不需要提前初始化向量长度,直接按物种名称赋值:
medie <- c() for (sp in levels(iris$Species)){ medie[sp] <- mean(subset(iris, Species == sp)$Petal.Length) }
正确结果验证
运行修正后的代码,会得到各物种分组的真实均值:
> medie setosa versicolor virginica 1.462 4.260 5.552
内容的提问来源于stack exchange,提问作者Alessia Ranucci
相关产品推荐
相关产品推荐

