You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言for循环计算iris数据集各物种均值问题求助

解决R语言for循环计算iris分组均值的问题

原代码存在三个核心问题,导致结果不符合预期:

  • 每次循环直接将结果赋值给datu,会覆盖之前的循环结果,最终仅保留最后一次循环的数据
  • ID = unique(i)逻辑错误,i是循环索引,无法对应具体物种名称
  • 计算均值时未按当前物种筛选数据,得到的是整个数据集的均值,而非分组均值

修改后的for循环代码

先初始化空数据框,循环时筛选对应物种的数据计算均值,再将结果追加到数据框中:

# 获取所有唯一物种
species_list <- unique(iris$Species)
# 初始化空数据框,指定列类型避免类型转换问题
datu <- data.frame(ID = character(), Sl = numeric(), Sw = numeric(), stringsAsFactors = FALSE)

for (i in seq_along(species_list)) {
  current_sp <- species_list[i]
  # 筛选当前物种的子集数据
  sub_data <- iris[iris$Species == current_sp, ]
  # 计算对应列的均值
  sl_avg <- mean(sub_data$Sepal.Length)
  sw_avg <- mean(sub_data$Sepal.Width)
  # 将结果追加到datu
  datu <- rbind(datu, data.frame(ID = current_sp, Sl = sl_avg, Sw = sw_avg))
}

# 查看结果
print(datu)

更高效的R风格写法(无需for循环)

R中推荐用内置函数或tidyverse工具实现分组统计,比for循环更简洁高效:

方法1:使用aggregate函数

datu <- aggregate(cbind(Sepal.Length, Sepal.Width) ~ Species, data = iris, FUN = mean)
# 重命名列匹配需求
colnames(datu) <- c("ID", "Sl", "Sw")
print(datu)

方法2:使用dplyr包

library(dplyr)
datu <- iris %>%
  group_by(Species) %>%
  summarise(Sl = mean(Sepal.Length), Sw = mean(Sepal.Width)) %>%
  rename(ID = Species)
print(datu)

内容的提问来源于stack exchange,提问作者iii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:45:41