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

求助:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:22:50