我如何使用 purrr 包来计算 my_tibble 中的 days_since 列

问题描述 投票:0回答:1

我有一个小标题(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

r tidyverse purrr
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.