【问题标题】:how to put a value in the first row of a group_by in R如何在 R 中 group_by 的第一行中放置一个值
【发布时间】:2017-09-29 22:58:34
【问题描述】:

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

如果我假设将来使用电动汽车提供相同的服务,我想估计出行之间的必要时间以满足 99% 的预订需求。

我有一份近 100 万份燃烧车辆预订的清单。 carN starttime stoptimedrivenkm ...

我使用 loadtime = starttime - lag(stoptime) 计算行程结束和最后一次使用开始之间的可能时间,所以我知道行程开始时的 SOC_S 是多少。

我计算了一次旅行所需的容量并将其从 SOC_S 中减去。所以我在旅行结束时得到了 SOC_E。

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

现在我有一些问题:

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

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

  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) 
      )
    

此代码不起作用。问题是

  1. 如何使用新变量?有这样的名称:“preTime

  2. 最后两个似乎进入了不规则循环。

问候

吕迪格

【问题讨论】:

  • 你能发帖head(B_ES) - 你的数据示例
  • # A tibble: 6 x 5 place car start_trip end_trip km 1 680000104 201 2014-04-30 19:42:00 2014- 05-01 00:58:00 22 2 680000125 222 2014-04-30 19:28:00 2014-05-01 00:55:00 45 3 681690121 1310 2014-04-30 20:05:00 2014-05- 01 00:55:00 36 4 680000128 225 2014-04-30 20:48:00 2014-05-01 00:52:00 31 5 691240301 1350 2014-04-30 18:59:00 2014-05-01 00 :46:00 42 6 680000120 217 2014-04-30 20:53:00 2014-05-01 00:46:00 11
  • ZOE_bat

标签: r dplyr lag lubridate lead


【解决方案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 kWh。它开始满载。如何为每辆车在 R 中 group_by 的第一行的特殊列中放置一个值?
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

无法真正理解问题的其余部分,但这可能会让您走得更远。

【讨论】:

  • 谢谢,我没有意识到 x1
【解决方案2】:

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

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)

结果:

小数点: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% 的行程会出现问题,因为开始时的充电状态对于预期行程来说太低了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多