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

如何对数据框的逐年递增子集累计使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:31:07