Если в строке существует конкретное значение, измените все оставшиеся значения в строке на новое значение - PullRequest
0 голосов
/ 04 февраля 2019

Итак, как выглядят данные:

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

Я хочу найти способ заменить все оставшиеся значения в строке на «Закрыто» после ячейки, где встречается значение «Завершено».Всегда следует просто сказать Closed после того, как произошло значение Complete, чтобы вы могли видеть, что есть несколько строк, которые не следуют этой логике, и это ошибка, которую мне нужно исправить.

Окончательные данные должны выглядеть следующим образом:

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 Closed      Closed     Closed    Closed

Я думал, что цикл for может просто запустить каждую строку в данных и проверить наличие значения «Complete», а затемпросто измените оставшиеся значения в этой строке на «Закрыто», но я не уверен, как будет выглядеть синтаксис.

1 Ответ

0 голосов
/ 04 февраля 2019

Я бы написал простую вспомогательную функцию для ясности:

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")
...