在R中按省份与年份计算指定列的均值问题
在R中按年份计算省份均值的解决方案
你的核心需求是为每个省份计算2006-2018年每年的均值,规则是对应年份的面积列除以计数列。之前使用rowMeans()得到错误结果,是因为该函数是对每行所有数值列求均值,而非按年份配对两列做除法运算。
以下是两种可行的实现方案:
方法一:基础R循环实现
适合不依赖第三方包的场景,步骤清晰:
- 先加载数据并清理空列:
# 加载你提供的数据框 dane_csv <- structure(list(Kod = c(0L, 200000L, 400000L, 600000L, 800000L, 1000000L), Nazwa = c("POLSKA", "DOLNOŚLĄSKIE", "KUJAWSKO-POMORSKIE", "LUBELSKIE", "LUBUSKIE", "ŁÓDZKIE"), gospodarstwa.ogółem.gospodarstwa.2006.... = c(9187L, 481L, 173L, 1072L, 256L, 218L), gospodarstwa.ogółem.gospodarstwa.2007.... = c(11870L, 652L, 217L, 1402L, 361L, 261L), gospodarstwa.ogółem.gospodarstwa.2008.... = c(14896L, 879L, 258L, 1566L, 480L, 314L), gospodarstwa.ogółem.gospodarstwa.2009.... = c(17091L, 1021L, 279L, 1710L, 579L, 366L), gospodarstwa.ogółem.gospodarstwa.2010.... = c(20582L, 1227L, 327L, 1962L, 833L, 420L), gospodarstwa.ogółem.gospodarstwa.2011.... = c(23449L, 1322L, 371L, 2065L, 1081L, 478L), gospodarstwa.ogółem.gospodarstwa.2012.... = c(25944L, 1312L, 390L, 2174L, 1356L, 518L), gospodarstwa.ogółem.gospodarstwa.2013.... = c(26598L, 1189L, 415L, 2129L, 1422L, 528L), gospodarstwa.ogółem.gospodarstwa.2014.... = c(24829L, 1046L, 401L, 1975L, 1370L, 508L), gospodarstwa.ogółem.gospodarstwa.2015.... = c(22277L, 849L, 363L, 1825L, 1202L, 478L), gospodarstwa.ogółem.gospodarstwa.2016.... = c(22435L, 813L, 470L, 1980L, 1148L, 497L), gospodarstwa.ogółem.gospodarstwa.2017.... = c(20257L, 741L, 419L, 1904L, 948L, 477L), gospodarstwa.ogółem.gospodarstwa.2018.... = c(19207L, 713L, 395L, 1948L, 877L, 491L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2006..ha. = c(228038L, 19332L, 4846L, 19957L, 12094L, 3378L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2007..ha. = c(287529L, 21988L, 5884L, 23934L, 18201L, 3561L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2008..ha. = c(314848L, 28467L, 5943L, 26892L, 18207L, 4829L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2009..ha. = c(367062L, 26427L, 6826L, 30113L, 22929L, 5270L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2010..ha. = c(519069L, 39703L, 7688L, 34855L, 35797L, 7671L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2011..ha. = c(605520L, 45547L, 8376L, 34837L, 44259L, 8746L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2012..ha. = c(661688L, 44304L, 8813L, 37466L, 52581L, 9908L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2013..ha. = c(669970L, 37455L, 11152L, 40819L, 54692L, 10342L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2014..ha. = c(657902L, 37005L, 11573L, 38467L, 53300L, 11229L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2015..ha. = c(580730L, 31261L, 10645L, 34052L, 46343L, 10158L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2016..ha. = c(536579L, 29200L, 9263L, 31343L, 43235L, 9986L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2017..ha. = c(494978L, 27542L, 8331L, 29001L, 37923L, 9260L), gospodarstwa.ogółem.powierzchnia.użytków.rolnych.2018..ha. = c(484677L, 27357L, 7655L, 28428L, 37174L, 8905L), X = c(NA, NA, NA, NA, NA, NA)), row.names = c(NA, 6L), class = "data.frame") # 移除全为NA的X列 dane_csv <- dane_csv[, -ncol(dane_csv)]
- 遍历年份计算对应均值:
# 定义年份范围 years <- 2006:2018 # 循环处理每个年份,生成对应均值列 for (year in years) { # 拼接对应年份的计数列和面积列名 count_col <- paste0("gospodarstwa.ogółem.gospodarstwa.", year, "....") area_col <- paste0("gospodarstwa.ogółem.powierzchnia.użytków.rolnych.", year, "..ha.") # 计算面积/计数的均值,新增列名格式为mean_年份 dane_csv[[paste0("mean_", year)]] <- dane_csv[[area_col]] / dane_csv[[count_col]] }
- (可选)计算每个省份2006-2018年的整体年均值:
dane_csv$overall_mean <- rowMeans(dane_csv[, grepl("mean_", colnames(dane_csv))], na.rm = TRUE)
方法二:tidyverse工具包实现
适合数据量大、需要更简洁代码的场景,依赖dplyr和tidyr:
- 加载工具包并完成数据处理:
library(tidyverse) # 加载数据(同上) dane_csv <- structure(...) # 你的数据结构 # 清洗数据+计算均值+重塑格式 dane_csv_result <- dane_csv %>% select(-X) %>% # 移除空列 # 将宽格式转为长格式,提取年份和指标类型 pivot_longer( cols = starts_with("gospodarstwa.ogółem"), names_to = c(".value", "year"), names_pattern = "gospodarstwa\\.ogółem\\.(.*)\\.(\\d{4})\\..*" ) %>% # 计算每年的面积/计数均值 mutate(mean = powierzchnia.użytków.rolnych / gospodarstwa) %>% # 转回宽格式,每个年份对应一列均值 pivot_wider( names_from = year, values_from = mean, names_prefix = "mean_" ) %>% # (可选)计算每个省份的整体年均值 mutate(overall_mean = rowMeans(across(starts_with("mean_")), na.rm = TRUE))
处理后的数据会新增mean_2006到mean_2018列,每个省份对应每年的计算结果,完全匹配你期望的Excel布局逻辑。
内容的提问来源于stack exchange,提问作者focus87krk
相关产品推荐
相关产品推荐

