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

在R中按省份与年份计算指定列的均值问题

在R中按年份计算省份均值的解决方案

你的核心需求是为每个省份计算2006-2018年每年的均值,规则是对应年份的面积列除以计数列。之前使用rowMeans()得到错误结果,是因为该函数是对每行所有数值列求均值,而非按年份配对两列做除法运算。

以下是两种可行的实现方案:


方法一:基础R循环实现

适合不依赖第三方包的场景,步骤清晰:

  1. 先加载数据并清理空列:
# 加载你提供的数据框
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)]
  1. 遍历年份计算对应均值:
# 定义年份范围
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]]
}
  1. (可选)计算每个省份2006-2018年的整体年均值:
dane_csv$overall_mean <- rowMeans(dane_csv[, grepl("mean_", colnames(dane_csv))], na.rm = TRUE)

方法二:tidyverse工具包实现

适合数据量大、需要更简洁代码的场景,依赖dplyr和tidyr:

  1. 加载工具包并完成数据处理:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:05:59