Одно решение с использованием tidyverse
и difftime
может быть достигнуто путем заполнения non_zero_flow_date
предыдущим dates
, если предыдущий flow
не равен нулю.Если предыдущий flow
равен 0
, тогда установите non_zero_flow_date
как NA
.Используйте tidyr::fill
для заполнения NA
значений столбца non_zero_flow_date
.Наконец, получите разницу между dates
и non_zero_flow_date
с помощью функции difftime
.
library(tidyverse)
df %>% mutate(dates = as.Date(dates)) %>%
mutate(non_zero_flow_date =
as.Date(ifelse(lag(flow) == 0, NA, lag(dates)),origin="1970-01-01")) %>%
fill(non_zero_flow_date) %>%
mutate(days.since.flow = difftime(dates, non_zero_flow_date, units = "days")) %>%
filter(!is.na(stormMark)) %>%
select(stormMark, days.since.flow)
# stormMark days.since.flow
# 1 1 NA days
# 2 2 3 days
Данные:
df <- read.table(text =
"dates station flow stormMark
1 2008-01-01 09512162 20 1
2 2008-01-02 09512162 0 NA
3 2008-01-03 09512162 5 NA
4 2008-01-04 09512162 0 NA
5 2008-01-05 09512162 0 NA
6 2008-01-06 09512162 3.5 2",
stringsAsFactors = FALSE, header = TRUE)