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

R语言循环问题:按国家计算potential=1时的年份均值与最小值

R语言按国家分组计算potential=1的年份均值与最小值

原始数据

数据框结构如下:

#    country year     key potential
# 1      FRA 2010 FRA2010         0
# 2      FRA 2011 FRA2011         0
# 3      FRA 2012 FRA2012         0
# 4      FRA 2013 FRA2013         1
# 5      ITA 2010 ITA2010         1
# 6      ITA 2011 ITA2011         1
# 7      ITA 2012 ITA2012         0
# 8      ITA 2013 ITA2013         1
# 9      USA 2010 USA2010         0
# 10     USA 2011 USA2011         0
# 11     USA 2012 USA2012         1
# 12     USA 2013 USA2013         1

数据构造代码:

df <- structure(list(country = c("FRA", "FRA", "FRA", "FRA", "ITA", 
"ITA", "ITA", "ITA", "USA", "USA", "USA", "USA"), year = c(2010L, 
2011L, 2012L, 2013L, 2010L, 2011L, 2012L, 2013L, 2010L, 2011L, 
2012L, 2013L), key = structure(1:12, levels = c("FRA2010", "FRA2011", 
"FRA2012", "FRA2013", "ITA2010", "ITA2011", "ITA2012", "ITA2013", 
"USA2010", "USA2011", "USA2012", "USA2013"), class = "factor"), 
    potential = c(0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1)), row.names = c(NA, 
-12L), class = "data.frame")

问题描述

需要按国家分组,计算每组中potential=1时的年份均值和最小值:

  • 均值预期:FRA=2013,ITA≈2011.33,USA=2012.5
  • 最小值预期:每个国家最早满足potential=1的年份

用户尝试通过循环实现,但代码仅返回单个结果值,无法得到每个国家对应的数据:

unique <- unique(df$key[df$potential == 1])
for (i in unique) {
mean_year <- mean(df$year[df$key == i], na.rm = TRUE)
date <- min(df$year[df$key == i], na.rm = TRUE)
}

解决方案

方法1:修正循环逻辑

循环中每次迭代会覆盖变量值,需提前创建容器存储每个国家的结果:

# 获取所有唯一国家
unique_countries <- unique(df$country)

# 创建空数据框存储结果
result_df <- data.frame(
  country = character(),
  mean_year = numeric(),
  min_year = integer(),
  stringsAsFactors = FALSE
)

# 遍历每个国家计算
for (cntry in unique_countries) {
  # 筛选当前国家且potential=1的年份
  target_years <- df$year[df$country == cntry & df$potential == 1]
  # 计算均值和最小值
  mean_y <- mean(target_years, na.rm = TRUE)
  min_y <- min(target_years, na.rm = TRUE)
  # 将结果添加到数据框
  result_df <- rbind(result_df, data.frame(
    country = cntry,
    mean_year = mean_y,
    min_year = min_y,
    stringsAsFactors = FALSE
  ))
}

# 输出结果
print(result_df)

运行后输出:

country mean_year min_year
1     FRA    2013.0     2013
2     ITA    2011.33     2010
3     USA    2012.5     2012

方法2:使用dplyr分组计算(推荐)

R中分组统计更推荐使用dplyr包,代码简洁高效,无需手动循环:

# 安装并加载dplyr(首次使用需安装)
# install.packages("dplyr")
library(dplyr)

# 分组计算
result_df <- df %>%
  filter(potential == 1) %>%  # 筛选potential=1的行
  group_by(country) %>%       # 按国家分组
  summarise(
    mean_year = mean(year, na.rm = TRUE),
    min_year = min(year, na.rm = TRUE)
  ) %>%
  ungroup()  # 取消分组

# 输出结果
print(result_df)

输出结果与方法1一致,代码更易读和维护。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:25:02