У меня есть набор данных со значениями, включая пропущенные значения. Цель состоит в том, чтобы создать вектор change
, который указывает на изменение по сравнению с последним предыдущим действительным значением.
Вот некоторые данные:
test <- data.frame(resp = c(9, NA, NA, 11, NA, NA, 6, 16, NA, 12, 0, 0, 0, 0, 0, NA, 0, 11, NA, NA, NA, NA, NA, NA, 14, NA, 23, NA, NA, 16, 16))
Идея заключается в следующем:
- без изменений приводит к значению
0
- значение> последнее предыдущее действительное значение добавляет
1
для каждого увеличения (например, 1, 2, 3) - значение <последнее предыдущее действительное значение приводит к <code>-1 и
-1
, если предыдущее значение уже было отрицательным.
Таким образом, результат выглядел бы так для данных выше:
resp change
1 9 0
2 NA NA
3 NA NA
4 11 1
5 NA NA
6 NA NA
7 6 -1
8 16 1
9 NA NA
10 12 -1
11 0 -2
12 0 0
13 0 0
14 0 0
15 0 0
16 NA NA
17 0 0
18 11 1
19 NA NA
20 NA NA
21 NA NA
22 NA NA
23 NA NA
24 NA NA
25 14 2
Я попытался для l oop, и это работает как-то, но я чувствую, что это грязный код плюс это очень медленно Любая идея для лучшего решения этой задачи (например, purrr)?
for (i in 2:nrow(test)) {
test$change[i] <- 0
test$change[i] <- case_when(
test$resp[i] > last(test$resp[which(!is.na(test$resp[1:i-1]))]) & last(test$change[which(!is.na(test$resp[2:i-1]))]) >= 0 ~ test$change[i] + last(test$change[which(!is.na(test$resp[1:i-1]))]) + 1,
test$resp[i] > last(test$resp[which(!is.na(test$resp[1:i-1]))]) & last(test$change[which(!is.na(test$resp[2:i-1]))]) <= 0 ~ test$change[i] + 1,
test$resp[i] < last(test$resp[which(!is.na(test$resp[1:i-1]))]) & last(test$change[which(!is.na(test$resp[2:i-1]))]) <= 0 ~ test$change[i] + last(test$change[which(!is.na(test$resp[1:i-1]))]) - 1,
test$resp[i] < last(test$resp[which(!is.na(test$resp[1:i-1]))]) & last(test$change[which(!is.na(test$resp[2:i-1]))]) >= 0 ~ test$change[i]- 1,
TRUE ~ test$change[i])
test$change[i] <- if_else(is.na(test$resp[i]), NA_real_, test$change[i])
}
В конце концов, это должно быть применено к набору данных с> 30 переменными и> 100000 строк.