как поместить значение в первую строку group_by в R

У меня много разных электромобилей (car1...carN) с состоянием заряда (SOC) в начале поездки (start_trip) и в конце (end_trip). В промежутках между поездками автомобиль загружается по максимуму. Я знаю емкость заряда для зарядки аккумулятора (~ 0,35 / мин) и необходимую емкость на каждый километр (0,22 / км). Между двумя поездками у нас есть несколько минут для загрузки, и во время поездки емкость уменьшается.

Я хочу оценить необходимое время между поездками, чтобы удовлетворить потребность в 99% бронирований, если я предполагаю предоставлять такую ​​же услугу с электронными автомобилями в будущем.

У меня есть список из почти 1 миллиона бронирований автомобилей с ДВС. время запуска автомобиля время остановки км ...

Я рассчитываю возможное время между окончанием поездки и началом последнего использования с помощью loadtime = starttime - lag(stoptime), поэтому я знаю, что такое SOC_S в начале поездки.

Я рассчитываю необходимую мощность для поездки и вычитаю ее из SOC_S. Так что я получаю SOC_E в конце поездки.

Теперь я хочу принять во внимание, что батарея не совсем разряжена в конце поездки. Итак, состояние заряда — это SOC_E с последней поездки + возможная нагрузка между поездками.

Теперь у меня есть некоторые проблемы:

  1. максимальная нагрузка 22 кВтч. Таким образом, нагрузка равна max("загруженный заряд по времени" или "maxLoad". Первый - это вектор, а второй - постоянное число. max(a, b) не работает.

  2. Я хочу установить первый SOC_S для первого бронирования для каждого автомобиля на 22 кВтч. Он начинается с полной загрузки. Как поместить значение в специальный столбец первой строки group_by в R для каждой машины?

  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 ‹- (Nutzungsbeginn - lag(Nutzungsende))/60"

  2. Последние два, кажется, приходят к неправильной петле.

С уважением

Рюдигер


person Rüdiger Kladt    schedule 29.09.2017    source источник
comment
Не могли бы вы опубликовать head(B_ES) - пример ваших данных   -  person pogibas    schedule 30.09.2017
comment
# Буквы: 6 x 5 мест car start_trip end_trip km ‹fctr› ‹int› ‹dttm› ‹dttm› ‹int› 1 680000104 201 2014-04-30 19:42:00 2014-05-01 00:58:00 22 2 680000125 222 30-04-2014 19:28:00 01-05-2014 00:55:00 45 3 681690121 1310 30-04-2014 20:05:00 01-05-2014 00:55:00 36 4 680000128 225 30.04.2014 20:48:00 01.05.2014 00:52:00 31 5 691240301 1350 30.04.2014 18:59:00 01.05.2014 00:46:00 42 6 2800101 2014-04-30 20:53:00 2014-05-01 00:46:00 11   -  person Rüdiger Kladt    schedule 30.09.2017
comment
ZOE_bat ‹- 22 # Максимальное потребление ZOE ZOE_потребление ‹- 0,233 # кВтч за километр ZOE_charge ‹- 0,366 # кВтч за минуту   -  person Rüdiger Kladt    schedule 30.09.2017


Ответы (2)


Воспроизводимый пример:

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 кВтч. Он начинается с полной загрузки. Как поместить значение в специальный столбец первой строки group_by в R для каждой машины?
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.

Не могу понять остальную часть вопроса, но это может продвинуть вас немного дальше.

person bill-felix    schedule 30.09.2017
comment
Спасибо, я не понял, что есть разница между x1 ‹- c(1,2,3,1,2,1,2) и x1 = c(1,2,3,1,2,1) ,2), что приводит к разным именам col_names. - person Rüdiger Kladt; 30.09.2017

Основываясь на ответах, я нашел следующее решение:

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 х 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% всех поездок были бы проблемы, потому что уровень заряда при запуске был слишком низким для предполагаемой поездки.

person Rüdiger Kladt    schedule 30.09.2017