Заменить строки с меньшими значениями, чем строки перед ним с интерполированными значениями - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть целочисленные переменные, которые являются функцией времени. Однако существуют ошибки, когда значение уменьшается на следующий день, и это связано с человеческой ошибкой. IE

Date           Cases
2020-03-03      24
2020-03-02      21
2020-03-01      23

В «Cases» 21 - ошибка. Как заменить значения в столбцах, которые меньше строк перед ними, интерполированным значением?

Ответы [ 3 ]

3 голосов
/ 14 апреля 2020

Вы можете попробовать

wrong <- c(0, diff(df$Cases)) < 0
df$Cases[wrong] <- df$Cases[which(wrong) - 1]

Результат:

df
#>         Date Cases
#> 1 2020-03-03    24
#> 2 2020-03-02    24
#> 3 2020-03-01    23
1 голос
/ 14 апреля 2020

Опция с case_when in dplyr

library(dplyr)
df1 %>% 
     mutate(Cases = case_when(Cases - lag(Cases, 
       default = first(Cases)) < 0 ~ lag(Cases), TRUE ~ Cases))
#        Date Cases
#1 2020-03-03    24
#2 2020-03-02    24
#3 2020-03-01    23

data

df1 <- structure(list(Date = c("2020-03-03", "2020-03-02", "2020-03-01"
), Cases = c(24L, 21L, 23L)), class = "data.frame", row.names = c(NA, 
-3L))
0 голосов
/ 14 апреля 2020

С интерполяцией:

df$Date[c(0, diff(df$Cases)) < 0] <- NA
df$Date <- as.POSIXct(zoo::na.approx(df$Date), origin = "1970-01-01")

Или, если вы хотите интерполировать Случаи:

df$Cases[c(0, diff(df$Cases)) < 0] <- NA
df$Cases <- zoo::na.approx(df$Cases)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...