В коде OP ifelse
test
не является логическим (согласно ?ifelse
- тест - объект, который может быть приведен в логический режим)
library(dplyr)
library(tidyr)
library(lubridate)
На основе OP обновить, чтобы заменить только последние элементы NA, может создать. функция для `замены только последних значений NA на предыдущие не-NA
f1 <- function(x) {
i1 <- cumsum(!is.na(x))
i2 <- i1== max(i1)
replace(x, which(i2)[-1], x[which(i2)[1]])
}
ta_roll_up4 %>%
arrange(Employee.ID, mdy(ta_start)) %>%
group_by(Employee.ID) %>%
mutate_at(vars(nxt_state, border_chk), f1)
# A tibble: 6 x 5
# Groups: Employee.ID [2]
# Employee.ID ta_start prv_state nxt_state border_chk
# <int> <chr> <chr> <chr> <int>
#1 33 10/24/2017 WYOMING COLORADO 1
#2 33 5/20/2019 WYOMING COLORADO 1
#3 19421 12/6/2019 TEXAS TEXAS 1
#4 19421 12/17/2019 TEXAS TEXAS 1
#5 19421 1/6/2020 TEXAS TEXAS 1
#6 19421 1/30/2020 TEXAS TEXAS 1
или использование na.locf
из zoo
library(zoo)
ta_roll_up4 %>%
arrange(Employee.ID, mdy(ta_start)) %>%
mutate(border_chk = replace(border_chk, 4, NA)) %>% # adding an NA in between
group_by(Employee.ID) %>%
mutate_at(vars(nxt_state, border_chk), ~
case_when(row_number() >= last(which(!is.na(.))) ~
na.locf0(.), TRUE ~ .))
data
ta_roll_up4 <- structure(list(Employee.ID = c(33L, 33L, 19421L, 19421L, 19421L,
19421L), ta_start = c("10/24/2017", "5/20/2019", "12/6/2019",
"12/17/2019", "1/6/2020", "1/30/2020"), prv_state = c("WYOMING",
"WYOMING", "TEXAS", "TEXAS", "TEXAS", "TEXAS"), nxt_state = c("COLORADO",
NA, "TEXAS", "TEXAS", "TEXAS", NA), border_chk = c(1L, NA, 1L,
1L, 1L, NA)), class = "data.frame", row.names = c(NA, -6L))