r语言 - 有条件地使用滞后值更新列中的值



我试图使用ifelse条件在以下数据框中更新RAIN列中的值。如果RAIN的值小于前一行RAIN的值,则将该值替换为前一行的值。示例数据框如下:

TRGCODE    gr      DATE      TIME     RAIN
12      24   2017-03-15   1645     00
12      24   2017-03-15   1700     00
12      24   2017-03-15   1715     0.5
12      24   2017-03-15   1730     00
12      24   2017-03-15   1745     0.5
12      24   2017-03-15   1800     0.5
12      24   2017-03-15   1815     00
12      24   2017-03-15   1830     00
12      24   2017-03-15   1845     0.5
12      24   2017-03-15   1900     00
12      24   2017-03-15   1915     00
12      24   2017-03-15   1930     0.5
12      24   2017-03-15   1945     0.5

I tried with

df <- df %>% group_by(TRGCODE, gr) %>% dplyr::mutate(RAIN = ifelse(RAIN < lag(RAIN, default = first(RAIN)), lag(RAIN), RAIN))

但是这不是我想要的工作方式(它只会改变时间1730,1815,1900的值,而不是1830 &1915)。期望的输出如下所示:

TRGCODE    gr      DATE      TIME     RAIN
12      24   2017-03-15   1645     00
12      24   2017-03-15   1700     00
12      24   2017-03-15   1715     0.5
12      24   2017-03-15   1730     0.5
12      24   2017-03-15   1745     0.5
12      24   2017-03-15   1800     0.5
12      24   2017-03-15   1815     0.5
12      24   2017-03-15   1830     0.5
12      24   2017-03-15   1845     0.5
12      24   2017-03-15   1900     0.5
12      24   2017-03-15   1915     0.5
12      24   2017-03-15   1930     0.5
12      24   2017-03-15   1945     0.5

这里有一个可能的解决方案:

library(tidyverse)
df <- read.table(text = "TRGCODE    gr      DATE      TIME     RAIN
12      24   2017-03-15   1645     00
12      24   2017-03-15   1700     00
12      24   2017-03-15   1715     0.5
12      24   2017-03-15   1730     00
12      24   2017-03-15   1745     0.5
12      24   2017-03-15   1800     0.5
12      24   2017-03-15   1815     00
12      24   2017-03-15   1830     00
12      24   2017-03-15   1845     0.5
12      24   2017-03-15   1900     00
12      24   2017-03-15   1915     00
12      24   2017-03-15   1930     0.5
12      24   2017-03-15   1945     0.5",
header = TRUE)
df %>%
group_by(TRGCODE, gr) %>%
mutate(RAIN = cummax(RAIN))
#> # A tibble: 13 × 5
#> # Groups:   TRGCODE, gr [1]
#>    TRGCODE    gr DATE        TIME  RAIN
#>      <int> <int> <chr>      <int> <dbl>
#>  1      12    24 2017-03-15  1645   0  
#>  2      12    24 2017-03-15  1700   0  
#>  3      12    24 2017-03-15  1715   0.5
#>  4      12    24 2017-03-15  1730   0.5
#>  5      12    24 2017-03-15  1745   0.5
#>  6      12    24 2017-03-15  1800   0.5
#>  7      12    24 2017-03-15  1815   0.5
#>  8      12    24 2017-03-15  1830   0.5
#>  9      12    24 2017-03-15  1845   0.5
#> 10      12    24 2017-03-15  1900   0.5
#> 11      12    24 2017-03-15  1915   0.5
#> 12      12    24 2017-03-15  1930   0.5
#> 13      12    24 2017-03-15  1945   0.5

由reprex包(v2.0.1)创建于2022-07-18

这没有使用ifelse,但它完成了您想要的工作

df<-structure(list(TRGCODE=c(12L,12L,12L,12L,12L,12L,12L,
12L,12L,12L,12L,12L,12L),gr=c(24L,24L,24L,24L,24L,
24L,24L,24L,24L,24L,24L,24L,24L),DATE=c("2017-03-15",
                             "2017-03-15","2017-03-15","2017-03-15","2017-03-15","2017-03-15",
                             "2017-03-15","2017-03-15","2017-03-15","2017-03-15","2017-03-15",
                             "2017-03-15","2017-03-15"),TIME=c(1645L,1700L,1715L,1730L,
                                                               1745L,1800L,1815L,1830L,1845L,1900L,1915L,1930L,1945L
                             ),RAIN=c(0,0,0.5,0,0.5,0.5,0,0,0.5,0,0,0.5,0.5
                             ),RAIN1=c(0,0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,
                                       0.5,0.5)),row.names=c(NA,-13L),class="data.frame")
df$RAIN1<-df$RAIN
for(i in 2:nrow(df)) {
if(df$RAIN1[i]<df$RAIN1[i-1])
df$RAIN1[i]<-(df$RAIN1[i-1])
}
df
df$RAIN<-df$RAIN1
df$RAIN1<-NULL
df

最新更新