用插值替换小于其前面行的值的行

3

我有一些整数变量是时间函数。然而,由于人为错误,存在值在一天之后下降的错误。例如:

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

在“Cases”中,21是一个错误。我该如何用插值方式替换列中小于它们前面行的值?


1
Cases 中的值应该是 24 还是 23? - Matt
它可以是23或24,只是因为它小于23,所以是错误的。 - purple_plop
3个回答

3

您可以尝试

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

第三行仍需要插值,因为它小于24。整个代码不应该在一个循环中吗? - ahb65
1
@ahb65 可能吧。看了一下再次提问,问题有点不太清楚。我认为我的解决方案适用于所描述的问题而不是所演示的问题。但如果作为循环执行,它将只是 for(i in seq_along(df$Cases)[-1]) if(df$Cases[i] < df$Cases[i - 1]) df$Cases[i] <- df$Cases[i - 1] - Allan Cameron

1

dplyrcase_when 的选项

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

数据

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

使用插值:

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

或者如果你想要插值Cases:

df$Cases[c(0, diff(df$Cases)) < 0] <- NA
df$Cases <- zoo::na.approx(df$Cases)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接