В очень простой версии мы игнорируем случаи, когда строки могут выглядеть как 1, 0, 1, 0
или 0, 0, 0, 0
. В этом случае мы можем использовать:
df <- data.frame(task_id, year2016, year2017, year2018, year2019)
df$output <- 0
df[df$year2016 == 0, ]$output <- 1
df[df$year2019 == 0, ]$output <- -1
Лог c для третьей строки состоит в том, что те, которых нет в начале, должны быть добавлены в какой-то момент; затем мы проверяем те, которые присутствовали в начале, но не в конце, и помечаем их как удаленные.
Логика c для более сложного случая:
- создает новый столбец (
num_switches
), который подсчитывает количество сальто в данной строке от 0 до 1 или наоборот - это то, что rle()
делает - , автоматически помечая что-либо
num_switches > 2
как output = -2
- для случаев, когда
num_switches <= 2
, пометить как выше
Полный код с расширенным набором игрушечных данных ниже. Обратите внимание, что ссылка 2:5
в подмножестве df
должна соответствовать столбцам года; более ответственная вещь здесь - вероятно, создать внешнюю переменную, которая будет отслеживать эти столбцы и ссылаться на них здесь (например, если вы добавите больше лет спустя).
task_id <- c('X001','X002','X003', 'X004', 'X005')
year2016 <- c(1, 1, 0, 1, 1)
year2017 <- c(1, 0, 0, 1, 0)
year2018 <- c(1, 0, 1, 1, 1)
year2019 <- c(0, 0, 1, 1, 0)
# output <- c(-1, -1, 1, 0)
df <- data.frame(task_id, year2016, year2017, year2018, year2019)
df$output <- 0
df$num_switches <- sapply(apply(df[,2:5], 1, function(x) rle(x)$lengths), length)
df[df$num_switches > 2, ]$output <- -2
df[df$year2016 == 0 & df$num_switches <= 2, ]$output <- 1
df[df$year2019 == 0 & df$num_switches <= 2, ]$output <- -1