рассчитать количество наблюдений между двумя значениями - PullRequest
0 голосов
/ 09 июня 2018

Для каждого отдельного значения stormMark я хотел бы рассчитать количество дней с момента последнего ненулевого числа в столбце потока.Вот пример моих данных:

> head(newdat)
        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

Желаемый результат будет выглядеть примерно так:

stormMark days.since.flow
 1          NA
 2          3

1 Ответ

0 голосов
/ 09 июня 2018

Одно решение с использованием 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...