R语言:按因子统计每年处于指定范围的日值数量
没问题,我来帮你搞定这个统计需求!针对你这种按因子(比如Country)+年份分组,统计日度数据落在特定范围的天数的需求,用R来实现非常高效,哪怕是百年级别的大数据也能轻松处理。
步骤1:补全并整理示例数据集
你给出的示例数据没写完,我先帮你补全并整理成标准的数据框,方便后续操作:
# 创建示例数据集(3年日度数据) Date <- seq(as.Date("2010/01/01"), by = "day", length.out = 1095) People <- sample.int(20, 1095, replace = TRUE) Country <- sample(x = c("Australia", "Canada", "Germany", "Japan"), 1095, replace = TRUE) df <- data.frame(Date, People, Country)
步骤2:核心统计实现
我给你提供两种常用方法,你可以根据自己的习惯选择:
方法一:用tidyverse(推荐,代码更易读且高效)
tidyverse系列包的dplyr非常适合这类分组统计任务,处理大数据的表现也很出色:
# 先加载所需包(如果没安装,先运行 install.packages("tidyverse")) library(tidyverse) # 定义你要统计的数值范围 lower_limit <- 15 upper_limit <- 18 # 分组统计核心代码 result <- df %>% # 从日期中提取年份 mutate(Year = lubridate::year(Date)) %>% # 筛选出People值在目标范围内的记录 filter(People >= lower_limit & People <= upper_limit) %>% # 按国家和年份分组,统计符合条件的天数 group_by(Country, Year) %>% summarise(Count_of_Days = n(), .groups = "drop") # 查看结果 print(result)
小提示:lubridate::year()函数可以快速从日期中提取年份,比base R的格式转换更省心;.groups = "drop"是为了取消分组状态,避免后续操作出现意外。
方法二:用base R(无需额外安装包)
如果不想安装新包,用base R也能实现同样的功能:
# 从日期列中提取年份 df$Year <- format(df$Date, "%Y") # 筛选出People值在15-18之间的记录 filtered_data <- df[df$People >= 15 & df$People <= 18, ] # 按Country和Year分组统计天数 result_base <- aggregate(. ~ Country + Year, data = filtered_data[, c("Country", "Year")], FUN = length) # 重命名统计列,让结果更清晰 colnames(result_base)[3] <- "Count_of_Days" # 查看结果 print(result_base)
大数据优化建议
因为你的数据集超过100年,数据量肯定不小,这里给你两个优化方向:
- 如果内存吃紧,推荐用
data.table包,它处理超大规模数据集的速度比dplyr更快,代码也很简洁:
# 安装并加载data.table(未安装的话运行 install.packages("data.table")) library(data.table) # 转换为data.table格式 setDT(df) # 分组统计 result_dt <- df[People >=15 & People <=18, .(Count_of_Days = .N), by = .(Country, year(Date))]
这里的.N是data.table中统计行数的快捷方式,非常方便。
- 导入数据时,尽量用
readr::read_csv(tidyverse)或fread(data.table)代替base R的read.csv,导入速度会快很多,还能节省内存。
内容的提问来源于stack exchange,提问作者helphelp
相关产品推荐
相关产品推荐

