rapids/src/features/phone_battery/episodes/battery_episodes.R

33 lines
1.8 KiB
R

source("renv/activate.R")
library("dplyr", warn.conflicts = F)
battery <- read.csv(snakemake@input[[1]])
episode_threshold_between_rows <- snakemake@params[["episode_threshold_between_rows"]]
if(nrow(battery) > 0){
episode_threshold_between_rows = episode_threshold_between_rows * 60000
battery_episodes <- battery %>%
filter(battery_status >= 2 ) %>% # discard unknown states
mutate(start_timestamp = timestamp, # a battery level starts as soon as is logged
end_timestamp = lead(timestamp) - 1, # a battery level ends as soon as a new one is logged
time_diff = (end_timestamp - start_timestamp),
# we assume the current level existed until the next row only if that row is logged within [episode_threshold_between_rows] minutes
end_timestamp = if_else(is.na(time_diff) | time_diff > (episode_threshold_between_rows), start_timestamp + (episode_threshold_between_rows), end_timestamp)) %>%
mutate(time_diff = c(1, diff(start_timestamp)),
level_diff = c(1, diff(battery_level)),
status_diff = c(1, diff(battery_status)),
episode_id = cumsum(level_diff != 0 | status_diff != 0 | time_diff > (episode_threshold_between_rows))) %>%
group_by(episode_id) %>%
summarise(device_id = first(device_id), battery_level = first(battery_level), battery_status = first(battery_status), start_timestamp=first(start_timestamp), end_timestamp = last(end_timestamp))
} else {
battery_episodes <- data.frame(device_id = character(),
episode_id = numeric(),
start_timestamp = numeric(),
end_timestamp = character(),
battery_level = character(),
battery_status = character())
}
write.csv(battery_episodes, snakemake@output[[1]], row.names = FALSE)