我试图使用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