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

基于R语言按年份计算各月份的出现百分比

按年份统计月份出现百分比的完整实现

嘿,我来帮你搞定这个按年份计算各月份出现百分比的需求!下面我会用base R和**tidyverse(dplyr)**两种常用方式来实现,你可以根据自己的习惯选择。

首先先确认我们的样本数据生成(和你给出的一致,先固定随机种子保证结果可复现):

set.seed(123)
df <- data.frame(
  loc.id = rep(1:1000, each = 35), 
  year = rep(1980:2014, times = 1000),
  month.id = sample(c(1:4,8:10,12), 35*1000, replace = TRUE)
)

方法一:使用Base R实现

我们可以用by()函数按年份分组,然后对每个分组内的month.id计算频数,再转化为百分比。最后把结果整理成一个清晰的数据框:

# 按年份分组计算每个月份的百分比
month_pct_base <- by(df$month.id, df$year, function(x) {
  tbl <- table(x)
  # 计算百分比,保留两位小数
  pct <- round(prop.table(tbl) * 100, 2)
  # 转成数据框方便查看
  data.frame(month.id = as.integer(names(pct)), percentage = pct)
})

# 把所有年份的结果合并成一个大的数据框
month_pct_base_df <- do.call(rbind, month_pct_base)
# 添加年份列(从行名提取)
month_pct_base_df$year <- as.integer(gsub("\\..*", "", rownames(month_pct_base_df)))
# 调整列顺序
month_pct_base_df <- month_pct_base_df[, c("year", "month.id", "percentage")]

# 查看1980年的结果(和你给出的频数对应,百分比就是频数/1000*100)
head(month_pct_base_df[month_pct_base_df$year == 1980, ])

运行后1980年的结果会和你的示例频数完全对应:比如month.id=1的频数是106,百分比就是10.6%,以此类推。

方法二:使用tidyverse(dplyr)实现

如果你习惯用tidyverse的语法,这种方式更直观,代码可读性也更高:

首先需要先加载dplyr包(如果没安装先运行install.packages("dplyr")):

library(dplyr)

month_pct_dplyr <- df %>%
  # 按年份和月份分组
  group_by(year, month.id) %>%
  # 计算每个组的频数
  count(name = "count") %>%
  # 按年份分组计算百分比
  group_by(year) %>%
  mutate(percentage = round((count / sum(count)) * 100, 2)) %>%
  # 取消分组
  ungroup()

# 查看1980年的结果
filter(month_pct_dplyr, year == 1980)

这个方法直接生成了整洁的数据框,每一行对应一个年份-月份的组合,包含频数和百分比,非常方便后续的分析或可视化。

验证结果

两种方法得到的结果完全一致,比如1980年month.id=1的百分比都是10.6%,和你给出的频数106完全匹配(106/1000*100=10.6)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:07:45