基于时间范围分组汇总df_count各列行和的R语言技术需求
解决R语言中按时间范围计算数据框列行和的问题
首先确保两个数据框的时间列都是时间类型,先完成格式转换:
# 加载必要工具包 library(lubridate) library(dplyr) library(purrr) # 转换df_count的date列为时间格式 df_count$date <- ymd_hms(df_count$date) # 转换start_end的时间列为时间格式 start_end <- start_end %>% mutate( start_co2_plume = ymd_hms(start_co2_plume), end_co2_plume = ymd_hms(end_co2_plume) )
方法一:基础循环实现
适合新手理解逻辑,逐行处理时间范围:
# 初始化结果列 start_end$cars_sum <- NA start_end$buses_sum <- NA start_end$trucks_sum <- NA # 遍历每个时间范围 for(i in 1:nrow(start_end)){ # 筛选符合当前时间范围的行 filtered_data <- df_count %>% filter(date >= start_end$start_co2_plume[i] & date <= start_end$end_co2_plume[i]) # 计算各列行和并赋值 start_end$cars_sum[i] <- sum(filtered_data$cars) start_end$buses_sum[i] <- sum(filtered_data$buses) start_end$trucks_sum[i] <- sum(filtered_data$trucks) }
方法二:Tidyverse向量化实现(高效版)
利用map2对每一组时间对批量处理,避免显式循环:
# 定义时间范围求和函数 calc_range_sum <- function(start, end){ df_count %>% filter(date >= start & date <= end) %>% summarise( cars_sum = sum(cars), buses_sum = sum(buses), trucks_sum = sum(trucks) ) } # 批量计算所有时间范围的求和结果 sum_results <- map2_dfr(start_end$start_co2_plume, start_end$end_co2_plume, calc_range_sum) # 合并结果到原数据框 start_end <- bind_cols(start_end, sum_results)
注意事项
- 若需调整时间范围的边界判定(如是否排除端点),可修改
filter中的逻辑运算符(如>或<) - 数据量较大时,优先选择向量化方法,效率远高于循环
- 务必保证所有时间列格式统一,避免因字符串格式不匹配导致筛选错误
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

