我正在try 过滤给定阈值的时间序列中的两个不同年份.对于第一年,我想获取值何时超过阈值的第一个实例.但是,如果该值连续几年超过该阈值,我希望获取该连续值最后一次出现的日期.其次,在这个时间序列中,我想抓住门槛被越过的第二个例子.但是,这一次不能在第一个选定值的两年内,如果不在两年内,则不使用该值.这看起来可能是什么样子的一个例子是:

dat <- data.frame(time = as.Date(c("2001-12-31","2002-12-31","2003-12-31","2004-12-31", 
                                   "2005-12-31","2006-12-31","2007-12-31","2008-12-31")),
                  value = c(-52.1,-52.44,23.5,-64.2,10.7,-15.4,-52.4,231.7))

我想筛选那些值为&lt;=-50的值,并 Select 给定条件的两年.预期输出为:

2002-12-31
2007-12-31

我try 遵循类似的框架,使用Slice函数来获取日期(来自另一个问题:Choosing first instance of a value by year in a time series),但不确定如何遵循不同阈值的标准提取.感谢任何人的帮助!

推荐答案

我认为这是游程编码(base::rledplyr::consecutive_iddata.table::rleid之一)和一些更简单的过滤的组合.

您将看到2*365+2作为一个判别器的用法:用于时差的POSIXt方法没有"year"作为选项,所以我们需要以天为单位,并且在2002-2007有一个闰年.

dplyr

library(dplyr)
dat %>%
  group_by(grp = consecutive_id(value <= -50)) %>%
  filter(any(value <= -50), row_number() == n()) %>%
  ungroup() %>%
  filter(row_number() == 1L | difftime(time, time[1], units="day") >= (2*365+2))
# # A tibble: 2 × 3
#   time       value   grp
#   <date>     <dbl> <int>
# 1 2002-12-31 -52.4     1
# 2 2007-12-31 -52.4     5

data.table

library(data.table)
as.data.table(dat)[, .SD[any(value <= -50), .(time, value)][.N,], by = .(grp = rleid(value <= -50))
  ][(seq(.N) == 1 | difftime(time, time[1], units="day") >= (2*365+2)),]
#      grp       time  value
#    <int>     <Date>  <num>
# 1:     1 2002-12-31 -52.44
# 2:     5 2007-12-31 -52.40

base R

(还有一点工作要做.)

# a home-grown base-R version of `rleid` and `consecutive_id` above
my_rleid <- function(...) {
  r <- rle(do.call(paste, c(list(...), sep = "_")))$lengths
  rep(seq_along(r), times = r)
}
dat |>
  transform(grp = my_rleid(value <= -50)) |>
  subset(ave(value <= -50, grp, FUN = function(z) any(z) & seq_along(z) == length(z))) |>
  subset(seq_along(time) == 1L | difftime(time, time[1], units="day") >= (2*365+2))
#         time  value grp
# 2 2002-12-31 -52.44   1
# 7 2007-12-31 -52.40   5

R相关问答推荐

R:将列名的字符载体传递给可以 Select 接受多个参数的函数

R数据帧中的布尔加法会产生布尔值而不是整值

我可以截断10字节的扩展数并转换为8字节的double吗?

多个ggpredicate对象的平均值

使用ggplot将平滑线添加到条形图

单击 map 后,将坐标复制到剪贴板

在(g)子中使用asserable字符

如何使用rmarkdown和kableExtra删除包含折叠行的表的第一列的名称

如何在geom_col中反转条

在另存为PNG之前隐藏htmlwidget绘图元素

R中插入符号训练函数的中心因子和尺度因子预测

为什么我的基准测试会随着样本量的增加而出现一些波动?

以更少间隔的较小表中的聚合离散频率表

使用data.table::fcase()而不是dplyr::case_When()时保持值

R:用GGPLATE,如何在两个独立的变量中制作不同形状的散点图?

条形图顶部与其错误条形图不对齐

根据纬度和距离连接两个数据集

如何使用同比折线图中的个别日

将多个变量组合成宽格式

Ggplot2如何找到存储在对象中的残差和拟合值?