Отслеживание изменений с последнего действительного ответа в цикле for - PullRequest
0 голосов
/ 03 марта 2019

Я бы хотел отследить количество изменений в последовательных суждениях за несколько повторных измерений.Это достаточно просто, когда все ответы завершены

vec1 <- c("plus", "plus", "minus", "plus")

for (i in 2:4) {
  vec1[i+3] <- ifelse(vec1[i] == vec1[i-1], "no change", "change")
}

vec1

[1] "plus"      "plus"      "minus"     "plus"      "no change" "change"    "change" 

Три новые записи в конце vec1 отслеживают изменение от одной записи к следующей по первым четырем записям.

Однако, когда пропущены записи, система выходит из строя

vec2 <- c("plus", "minus", NA, "plus")

for (i in 2:4) {
  vec2[i+3] <- ifelse(vec2[i] == vec2[i-1], "no change", "change")
}

vec2

[1] "plus"   "minus"  NA       "plus"   "change" NA       NA 

Я бы хотел, чтобы машина отслеживала изменения не с непосредственно предшествующей записи (какой бы она ни была), а с немедленнойпредыдущая действительная запись.

Так что я бы хотел, чтобы вывод для vec2 был

[1] "plus"   "minus"  NA       "plus"   "change" NA       "change

, а последняя запись отражает тот факт, что четвертая запись ("plus") отличалась от последней действительной записи, запись вторая ("minus")

1 Ответ

0 голосов
/ 03 марта 2019

Существует удобная функция na.locf в zoo, которая заполняет NA самым последним значением, отличным от NA.

vec1 <- c("plus", "plus", "minus", "plus")
vec2 <- c("plus", "minus", NA, "plus")

lag_change <- function(x) {
  ifelse(x[-1] == zoo::na.locf(head(x, -1)), "no change", "change")
}

lag_change(vec1)
lag_change(vec2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...