У меня есть проблема, которую я могу решить с помощью медленного и неуклюжего l oop в R. Однако я надеюсь, что есть более элегантное (и более быстрое) решение ...
самое простое объяснение, которое я могу придумать: каждая строка данных описывает действие на переключателе. Строки сортируются по идентификатору переключателя (переключатель 1, переключатель 2 и т. Д. c.) И по хронологическому порядку действий. Каждый переключатель может быть включен или выключен в любой момент времени. Действие может быть «включить», «выключить» или «оставить в покое». Для каждой строки я хочу знать состояние переключателя (включен или выключен) как до, так и после действия, описанного в этой строке.
Каждый переключатель запускается в положении «выключено».
(данные, с которыми я работаю, на самом деле относятся к данным страхового полиса, но эта аналогия на основе коммутаторов работает и, вероятно, проще для понимания)
Воспроизводимый пример:
df <- data.frame(switch_id = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3),
counter = c(1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4),
action = c("on", "off", "on", "off", "on", "same", "same", "same", "on", "same", "same", "same", "off", "off", "off", "on", "off", "same", "on"))
Я могу доберись туда, где я хочу использовать не очень элегантный l oop:
df$status_before <- NA
df$status_after <- NA
for(i in 1:nrow(df))
{
if(df$counter[i] == 1)
{
df$status_before[i] <- FALSE # switch always starts in the "off" position
}
else
{
df$status_before[i] <- df$status_after[i-1]
}
if(df$action[i] == "on") {
df$status_after[i] <- TRUE
}
else if(df$action[i] == "off")
{
df$status_after[i] <- FALSE
}
else # "same"
{
df$status_after[i] <- df$status_before[i] # leave everything alone
}
}
... но, очевидно, в R циклы лучше избегать, потому что они работают очень медленно. Конечно, это не имеет значения в этом крошечном наборе данных, но реальные данные, с которыми я работаю, имеют ~ 1 млн строк, поэтому это может быть проблемой.
Есть ли «векторизованное» решение для этого, возможно, с использованием dplyr
введите команды?
Спасибо.