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

