我有一个小标题(my_tibble),有两列,天下雨了。 Day 是天数,rained 是一个整数值,如果当天下雨,则等于 1;如果没有下雨,则等于 0。我想计算第三列 days_since,它表示自下雨以来的天数(不包括当天)。经过大量的试验和错误,我想出了一个可以产生所需输出的脚本(请参见下面的 reprex),但是,它不是很优雅,我很好奇是否可以使用 purrr 包来实现这一点。
我的蛮力方法计算了一个辅助列 temp,它代表下雨的天数(数字)。然后我从天数中减去该数字以获得 days_since,除非当天下雨,在这种情况下,我从当天减去 Lead(temp) 以获得 days_since。
library(tidyverse)
library(dplyr)
library(reprex)
my_tibble <- tibble(day = 1:10, rained = c(1, 0, 1, 0, 0, 1, 0, 0, 0, 1))
my_tibble <- my_tibble %>%
arrange(desc(day)) %>%
mutate(seed = 1L) %>%
mutate(rows_that_are_1 = day * rained) %>%
mutate(temp = if_else(row_number() == 1, NA_real_, rows_that_are_1)) %>%
fill(temp, .direction = c('up')) %>%
mutate(temp = if_else(temp ==0, NA_real_, temp)) %>%
fill(temp, .direction = c('up')) %>%
select(day, rained, temp) %>%
mutate(days_since = if_else(day-temp >0, day-temp, day-lead(temp))) %>%
replace_na(list(days_since =0)) %>%
select(day, rained, days_since)
print(my_tibble)
#> # A tibble: 10 × 3
#> day rained days_since
#> <int> <dbl> <dbl>
#> 1 10 1 4
#> 2 9 0 3
#> 3 8 0 2
#> 4 7 0 1
#> 5 6 1 3
#> 6 5 0 2
#> 7 4 0 1
#> 8 3 1 2
#> 9 2 0 1
#> 10 1 1 0
创建于 2024-01-28,使用 reprex v2.0.2
sbtscs()
包中的 stevemisc
函数将为您执行此操作,但您必须修改第一天的值。该函数旨在随着时间的推移与多个横截面单元一起使用,因此如果您还没有横截面标识符,则必须创建一个横截面标识符。这就是下面的obs
。
library(dplyr)
library(stevemisc)
my_tibble <- tibble(day = 1:10, rained = c(1, 0, 1, 0, 0, 1, 0, 0, 0, 1))
my_tibble %>%
mutate(obs = 1) %>%
sbtscs(., event=rained, tvar=day, csunit = obs) %>%
mutate(spell = ifelse(day == 1, 0, spell + 1)) %>%
select(-obs) %>%
rename(days_since = spell)
#> # A tibble: 10 × 3
#> day rained days_since
#> <int> <dbl> <dbl>
#> 1 1 1 0
#> 2 2 0 1
#> 3 3 1 2
#> 4 4 0 1
#> 5 5 0 2
#> 6 6 1 3
#> 7 7 0 1
#> 8 8 0 2
#> 9 9 0 3
#> 10 10 1 4
创建于 2024-01-28,使用 reprex v2.0.2