求助:使用R的dplyr按日计算车辆速度相关比例指标
解决方案
你的核心需求是按日期聚合计算加权值:sum(car * 每组car_speed_hist_0to70plus第一个元素) / sum(car),原代码的问题在于分组对象错误,且没有正确处理列表列的取值。下面是两种可行的实现方式:
方法一:使用dplyr + lubridate
先提取date_corr的日期部分作为分组依据,再提取car_speed_hist_0to70plus的第一个元素,最后按日聚合计算:
library(dplyr) library(lubridate) library(purrr) results %>% # 提取date_corr的日期部分,用于按日分组 mutate(date_only = as_date(date_corr), # 提取每个car_speed_hist_0to70plus向量的第一个元素 speed_hist_first = map_dbl(car_speed_hist_0to70plus, ~ .x[1])) %>% # 按日期分组 group_by(date_only) %>% # 计算目标值,同时处理sum(car)=0的情况避免报错 summarise(target_value = ifelse(sum(car) == 0, NA, sum(car * speed_hist_first) / sum(car))) %>% ungroup()
方法二:使用timetk简化时间分组
timetk的summarise_by_time可以直接按指定时间粒度聚合,结合列表列处理:
library(dplyr) library(timetk) library(purrr) results %>% mutate(speed_hist_first = map_dbl(car_speed_hist_0to70plus, ~ .x[1])) %>% timetk::summarise_by_time( .date_var = date_corr, .by = "day", target_value = ifelse(sum(car) == 0, NA, sum(car * speed_hist_first) / sum(car)) )
关键说明
- 因为
car_speed_hist_0to70plus是列表列(每个单元格是一个向量),必须用purrr::map_dbl提取每个向量的第一个元素,才能和car列做乘法运算。 - 加入
ifelse(sum(car) == 0, NA, ...)是为了避免当日车流量为0时出现除以0的错误,你可以根据需求调整这部分逻辑(比如赋值为0)。 - 测试你的示例数据时,2023-03-29的
sum(car)是4,sum(car*speed_hist_first)是4*50=200,所以目标值为200/4=50;2023-03-30的sum(car)是0,结果为NA,符合预期。
内容的提问来源于stack exchange,提问作者leparc
相关产品推荐
相关产品推荐

