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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:12:04