Я бы написал простую вспомогательную функцию для ясности:
close_after_complete = function(x) {
ifelse(cumsum(x == "Complete") >= 1 & x != "Complete", "Closed", x)
}
Вы можете прочитать cumsum(x == "Complete") >= 1
как ', мы видели по крайней мере 1 "полный" ', иконечно, x != "Complete"
- это ', но текущее значение не является "Завершенным" '.Когда оба эти условия выполнены, вы хотите изменить значение на «закрытое».
Поскольку мы работаем со строками, преобразование в матрицу (неявно) и использование apply
имеет смысл:
t(apply(df, 1, close_after_complete))
# x1 x2 x3 x4 x5 x6 x7 x8 x9
# [1,] "0" "0" "0" "1" "2" "Complete" "Closed" "Closed" "Closed"
# [2,] "0" "0" "0" "0" "0" "0" "0" "0" "Complete"
# [3,] "0" "1" "2" "3" "Complete" "Closed" "Closed" "Closed" "Closed"
Вы можете преобразовать обратно во фрейм данных с помощью as.data.frame()
, если хотите.
# using this data
df = read.table(header = T, stringsAsFactors = F, text = "x1 x2 x3 x4 x5 x6 x7 x8 x9
0 0 0 1 2 Complete Closed Closed Closed
0 0 0 0 0 0 0 0 Complete
0 1 2 3 Complete 1 1 1 1")