R 高于阈值的连续值的位置和值

R 高于阈值的连续值的位置和值,r,R,我需要找到我的数据连续几天达到阈值的位置。我正在寻找超过阈值的4个连续观测值。我想返回满足这些条件的序列的第一次观察的位置 以下是一个示例数据集: eg = structure(list(t.date = structure(c(1L, 2L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), .Label = c("4/30/11", "5/1/11", "5/10/11", "5/11/11

我需要找到我的数据连续几天达到阈值的位置。我正在寻找超过阈值的4个连续观测值。我想返回满足这些条件的序列的第一次观察的位置

以下是一个示例数据集:

eg = structure(list(t.date = structure(c(1L, 2L, 11L, 12L, 13L, 14L, 
15L, 16L, 17L, 18L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), .Label = c("4/30/11", 
"5/1/11", "5/10/11", "5/11/11", "5/12/11", "5/13/11", "5/14/11", 
"5/15/11", "5/16/11", "5/17/11", "5/2/11", "5/3/11", "5/4/11", 
"5/5/11", "5/6/11", "5/7/11", "5/8/11", "5/9/11"), class = "factor"), 
t.avg = c(4L, 4L, 5L, 6L, 10L, 18L, 18L, 18L, 18L, 12L, 10L, 
10L, 8L, 8L, 9L, 10L, 6L, 5L)), .Names = c("date", "avg"
), row.names = c(NA, -18L), class = "data.frame")
我想要平均值符合标准的日期(平均值>17,持续4天) 一种方法:

eg$date %in% eg$date[which(eg$avg > 17)]
# [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
# [13] FALSE FALSE FALSE FALSE FALSE FALSE
在这种情况下,我可以将第一个
TRUE
作为答案,但如果第二个、第三个或第四个
TRUE

我需要条件为
TRUE
的第一个日期:

eg$date[which(eg$avg > 17)]
# [1] 5/5/11 5/6/11 5/7/11 5/8/11
以及系列中第一次观测的位置:

which(eg$avg > 17)
# [1] 6 7 8 9
我发现了相关的问题,但我无法根据自己的需要调整方法

非常感谢。

图书馆(动物园)
library(zoo)
#  Get the index value
xx <- which(rollapply(eg$avg,4, function(x) min(x))>17)[1]
# Get the date
eg$date[xx]
#获取索引值 xx 17)[1] #得到日期 例如$date[xx]
使用游程编码(
rle

>rle(例如$avg>17)
游程编码
长度:int[1:3]549
值:logi[1:3]FALSE-TRUE-FALSE
(第17组)
rleg$LENGS[!rleg$values][1]#返回,因此向其中添加一个
#仅在这种情况下有效b/c不测试Gt 17的运行长度
#如果前4个全部gt 17,则返回1
#否则返回1+c长度之和,直到第一个true,长度Gt或等于4
#这样做的代码。
if(rleg$values[1]&&rleg$length[1]>=4){1}else{
1+cumsum(rleg$length[1:which(rleg$length>=4&
rleg$values)][1])}
#[1] 6

也可以使用base R完成:

eg$th = ifelse(eg$avg>17, 1,0)
for(i in 4:nrow(eg)) {if(sum(eg$th[(i-3):i])>3) print(i-3)}
[1] 6
实际日期:

for(i in 4:nrow(eg)) {if(sum(eg$th[(i-3):i])>3) print(eg[i-3,1])}
[1] 5/5/11

那不应该是
rollmin
。。。如果存在这样一个函数。或者可能是滚压(…,min,4)好球!我对字段名“avg”感到困惑,只是继续使用它。我编辑以反映您的评论。
rollmax
存在,因此:
which(-rollmax(-例如$avg,4)>17)[1]
for(i in 4:nrow(eg)) {if(sum(eg$th[(i-3):i])>3) print(eg[i-3,1])}
[1] 5/5/11