如何在R

时间:2017-09-29 22:58:34

标签: r dplyr lag lubridate lead

我有很多不同的电动汽车(car1 ... carN),在开始(start_trip)和结束(end_trip)的开始时带有充电状态(SOC)。在行驶之间,车辆装载到最高水平。我知道装载电池的充电容量(~0.35 /分钟)和每公里所需的容量(0.22 /公里)。在两次旅行中,我们有几分钟的时间来装载,在旅行期间,容量会减少。

我想估计在99%的预订中旅行之间必要的时间,如果我假设将来会用电子汽车提供相同的服务。

我列出了近100万辆使用燃烧车辆的预订。 carN starttime stoptime drivenkm ...

我计算了行程结束和最后一次使用开始之间的可能时间,加载时间=启动时间 - 延迟(停止时间),所以我知道,行程开始时的SOC_S是什么。

我计算出行程所需的容量并从SOC_S中减去它。所以我在旅行结束时得到了SOC_E。

现在我想考虑一下,在旅行结束时电池并非真空。因此,充电状态是最后一次行程的SOC_E +行程之间可能的负载。

现在我遇到了一些问题:

  1. 最大负载为22 kWh。所以负载是最大值(“按时间加载”或“maxLoad”。第一个是向量,secon是一个常数.max(a,b)不起作用。

  2. 我想将每辆车的首次预订的第一个SOC_S设置为22千瓦时。它开始满载。如何将值放在R中group_by的第一行的特殊列中,用于evvery car?

  3. 如何计算所需载荷时间的值以满足99%的使用量?像excel中的某个解决方案?

    B_ES <- B_ES %>%
      arrange(car, start_trip) %>%
      group_by(car) %>%
      mutate(
        preTime <- (start_trip - lag(end_trip))/60,
        useTime <- (end_trip - start_trip)/60,
        postTime <- (lead(start_trip) - end_trip)/60,
        SOC_S <- preTime * ZOE_charge,
        E_consumption <- km * ZOE_consumption,
        SOC_E <- SOC_S - E_consumption
        SOC_S <- SOC_S + lag(SOC_E) 
      )
    
  4. 此代码不起作用。问题是

    1. 我如何使用新变量?有这样的类名:“preTime&lt; - (Nutzungsbeginn - lag(Nutzungsende))/ 60”

    2. 最后两个似乎是一个不规则的循环。

    3. 问候

      Ruediger

2 个答案:

答案 0 :(得分:1)

可重复的例子:

foo <- data_frame(group = c('A','A','A','B','B','C','C')
             , x1 = c(1,2,3,1,2,1,2)
             , SOC_S = c(4,5,6,4,5,4,5))

关于你的第二个目标:

  
      
  1. 我想将每辆车的首次预订的第一个SOC_S设置为22千瓦时。它开始满载。如何将值放在R的group_by的第一行的特殊列中,用于evvery car?
  2.   
library(tidyverse)

dd <- foo %>% group_by(group) %>%
    mutate(rownumber = 1:n()        ## a helper column to find first row
    , special = ifelse(rownumber == 1, 22, SOC_S)) ## vectorized edits based on rownumber

注意:如果愿意,您也可以将special替换为SOC_S

无法解决问题的其余部分,但这可能会让你更进一步。

答案 1 :(得分:0)

根据答案,我找到了以下解决方案:

ZOE_battery <- 22 # kWh
ZOE_consumption <- 0.233 # kWh/Kilometer
ZOE_chargeflow <- 0.366 # kWh/Minute

ZOE <- ZOE %>%
  arrange(car, start_trip) %>%
  group_by(car) %>%
  mutate(
    seq_id = row_number(),
    preTime = (start_trip - lag(end_trip))/60,
    useTime = (end_trip - start_trip)/60,
    postTime = (lead(start_trip) - end_trip)/60,
    SOC_S = ifelse(seq_id == 1, ZOE_battery, 
                   ifelse(preTime * ZOE_chargeflow > ZOE_battery, ZOE_battery, preTime * ZOE_chargeflow)),
    consumption = km * ZOE_consumption,
    SOC_E = SOC_S - consumption
  )
ZOE_P <- ZOE %>% # Trips with possible problems
  filter(SOC_S <= 0 | SOC_E <0)

结果:

A tibble:6 x 12

团体:汽车[1]

  place   car          start_trip            end_trip    km seq_id   preTime  useTime  postTime SOC_S consumption
 <fctr> <int>              <dttm>              <dttm> <int>  <int>    <time>   <time>    <time> <dbl>       <dbl>
1 681990401   171 2014-04-30 20:31:00 2014-05-01 12:08:00    43      1   NA secs 937 secs 1350 secs    22      10.019
2 681990401   171 2014-05-02 10:38:00 2014-05-02 14:03:00    32      2 1350 secs 205 secs 1512 secs    22       7.456
3 681990401   171 2014-05-03 15:15:00 2014-05-03 22:49:00    25      3 1512 secs 454 secs  791 secs    22       5.825
4 681990401   171 2014-05-04 12:00:00 2014-05-04 17:07:00    71      4  791 secs 307 secs  879 secs    22      16.543
5 681990401   171 2014-05-05 07:46:00 2014-05-05 13:38:00    71      5  879 secs 352 secs 1418 secs    22      16.543
6 681990401   171 2014-05-06 13:16:00 2014-05-06 19:20:00    52      6 1418 secs 364 secs   19 secs    22      12.116

现在我知道,只有1.5%的旅行会遇到问题,因为启动时的充电状态对于预定行程来说是低的。