【问题标题】:calculate number of observations between two values计算两个值之间的观察次数
【发布时间】:2023-03-05 20:03:01
【问题描述】:

对于每个单独的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

【问题讨论】:

标签: r


【解决方案1】:

如果先前的flow 不为零,则可以通过使用先前的dates 填充non_zero_flow_date 来实现使用tidyversedifftime 的解决方案。如果之前的flow0,则将non_zero_flow_date 设置为NA。使用tidyr::fill 填充non_zero_flow_date 列的NA 值。最后,用difftime函数得到datesnon_zero_flow_date的区别。

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)

【讨论】:

    猜你喜欢
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多