如何对数据框的逐年递增子集累计使用summarise与n_distinct
逐年递增年份区间内城市与州的唯一值统计方案
原始数据定义
CERS = data.frame(IDs = c(seq(1, 10, by = 1)), city = c("Vienna" , "Bratislava" , "Prague", "Budapest", "Amsterdam", "Turin", "Barcelona", "Bratislava", "Budapest", "Prague" ), state = c("AT" , "SK" , "CZ", "HU", "NL", "IT", "ES", "SK", "HU", "CZ"), year = c(seq(2011, 2020, by = 1)))
需求说明
统计从2011开始逐年扩展的年份区间(即2011、2011:2012、2011:2013……2011:2020)内,不同城市和州的唯一数量,最终输出为表格形式。
方案一:dplyr + purrr 实现
利用purrr::map_dfr遍历所有目标年份区间,批量处理并合并结果:
library(dplyr) library(purrr) # 生成所有需要的区间结束年份 end_years <- seq(2011, 2020, by = 1) # 遍历每个结束年份,统计对应区间的唯一值数量 result_dplyr <- map_dfr(end_years, function(end_year) { CERS %>% filter(year >= 2011 & year <= end_year) %>% summarise( year_range = paste0("2011:", end_year), n_dist_city = n_distinct(city), n_dist_state = n_distinct(state) ) }) # 输出结果 print(result_dplyr)
代码说明
map_dfr会自动将每个区间的统计结果按行合并成一个数据框year_range列明确标注当前统计的年份区间,便于识别对应结果
方案二:基础R实现
不依赖第三方包,用循环直接处理每个区间:
# 生成所有区间结束年份 end_years <- 2011:2020 # 初始化结果数据框 result_base <- data.frame( year_range = character(length(end_years)), n_dist_city = integer(length(end_years)), n_dist_state = integer(length(end_years)), stringsAsFactors = FALSE ) # 循环处理每个年份区间 for (i in seq_along(end_years)) { end_year <- end_years[i] # 筛选当前区间的数据 subset_data <- CERS[CERS$year >= 2011 & CERS$year <= end_year, ] # 填充结果 result_base$year_range[i] <- paste0("2011:", end_year) result_base$n_dist_city[i] <- length(unique(subset_data$city)) result_base$n_dist_state[i] <- length(unique(subset_data$state)) } # 输出结果 print(result_base)
代码说明
- 先初始化结果数据框的结构,避免循环中频繁修改数据框结构影响效率
- 用
unique函数统计唯一值数量,替代dplyr的n_distinct
内容的提问来源于stack exchange,提问作者Miroslav
相关产品推荐
相关产品推荐

