如何在 R 中的 group_by 的第一行中放置一个值
how to put a value in the first row of a group_by in R
我有很多不同的电动汽车 (car1 ... carN) 在旅行开始时 (start_trip) 和结束时 (end_trip).在旅行之间,汽车被装载到最大水平。我知道电池加载的充电容量(~0.35 /分钟)和每公里所需的容量(0.22 / 公里)。在两次行程之间,我们有几分钟的时间来加载,而在一次行程中,容量会减少。
如果我假设将来使用电动汽车提供相同的服务,我想估计满足 99% 的预订需要的行程之间的必要时间。
我有一份包含近 100 万笔内燃机车辆预订的清单。
carN starttime stoptime drivenkm
...
我用 loadtime = starttime - lag(stoptime) 计算旅行结束和最后一次使用开始之间的可能时间,所以我知道,SOC_S 是什么旅行.
我计算了一次旅行所需的容量,然后从 SOC_S 中减去它。所以我在旅行结束时得到 SOC_E。
现在我想考虑一下,旅行结束时电池并不是真的没电了。因此,上次行程的充电状态为 SOC_E + 行程之间的可能负载。
现在我遇到了一些问题:
最大负载为22千瓦时。所以负载是 max("loaded charge by time" 或 "maxLoad"。第一个是向量,第二个是常数。max(a, b) 不起作用。
我想将每辆车首次预订的第一个 SOC_S 设置为 22 千瓦时。它开始满载。如何在 R 中的每辆汽车的 group_by 第一行的特殊列中放置一个值?
如何计算满足 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)
)
此代码无效。问题是
如何使用新变量?有这样的colnames:"preTime <- (Nutzungsbeginn - lag(Nutzungsende))/60"
最后两个好像来个不规则循环
此致
鲁迪格
可重现的例子:
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))
关于你的第二个目标:
- I want to set the first SOC_S for the first booking for every car to 22 kWh. It starts fully loaded. How to put a value in a special column of the first row of a group_by in R for evvery car?
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
。
无法真正理解问题的其余部分,但这可能会让您走得更远。
根据答案,我找到了以下解决方案:
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% 的行程会出现问题,因为开始时的充电状态对于预定行程来说太低了。
我有很多不同的电动汽车 (car1 ... carN) 在旅行开始时 (start_trip) 和结束时 (end_trip).在旅行之间,汽车被装载到最大水平。我知道电池加载的充电容量(~0.35 /分钟)和每公里所需的容量(0.22 / 公里)。在两次行程之间,我们有几分钟的时间来加载,而在一次行程中,容量会减少。
如果我假设将来使用电动汽车提供相同的服务,我想估计满足 99% 的预订需要的行程之间的必要时间。
我有一份包含近 100 万笔内燃机车辆预订的清单。 carN starttime stoptime drivenkm ...
我用 loadtime = starttime - lag(stoptime) 计算旅行结束和最后一次使用开始之间的可能时间,所以我知道,SOC_S 是什么旅行.
我计算了一次旅行所需的容量,然后从 SOC_S 中减去它。所以我在旅行结束时得到 SOC_E。
现在我想考虑一下,旅行结束时电池并不是真的没电了。因此,上次行程的充电状态为 SOC_E + 行程之间的可能负载。
现在我遇到了一些问题:
最大负载为22千瓦时。所以负载是 max("loaded charge by time" 或 "maxLoad"。第一个是向量,第二个是常数。max(a, b) 不起作用。
我想将每辆车首次预订的第一个 SOC_S 设置为 22 千瓦时。它开始满载。如何在 R 中的每辆汽车的 group_by 第一行的特殊列中放置一个值?
如何计算满足 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) )
此代码无效。问题是
如何使用新变量?有这样的colnames:"preTime <- (Nutzungsbeginn - lag(Nutzungsende))/60"
最后两个好像来个不规则循环
此致
鲁迪格
可重现的例子:
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))
关于你的第二个目标:
- I want to set the first SOC_S for the first booking for every car to 22 kWh. It starts fully loaded. How to put a value in a special column of the first row of a group_by in R for evvery car?
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
。
无法真正理解问题的其余部分,但这可能会让您走得更远。
根据答案,我找到了以下解决方案:
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% 的行程会出现问题,因为开始时的充电状态对于预定行程来说太低了。