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
相关产品推荐
相关产品推荐

