在R中按组查找三个大于阈值的连续数字

在R中按组查找三个大于阈值的连续数字,r,R,我如何获得其先前样本连续且在组中大于固定阈值的样本的索引 在下面的示例中,我需要找到连续3个采样的时间,其速度大于35速度>=35分组 speed_threshold = 35 Group Time Speed 1 5 25 1 10 23 1 15 21 1 20 40 # Speed > 35 1 25 42 # Speed > 35 1 30

我如何获得其先前样本连续且在组中大于固定阈值的样本的索引

在下面的示例中,我需要找到连续3个采样的时间,其速度大于35速度>=35分组

speed_threshold = 35

Group   Time    Speed
1       5       25
1       10      23
1       15      21
1       20      40 # Speed > 35
1       25      42 # Speed > 35
1       30      52 # Speed > 35
1       35      48 # <--- Return time = 35 as answer for Group 1 !
1       40      45
2       5       22
2       10      36 # Speed > 35
2       15      38 # Speed > 35
2       20      46 # Speed > 35
2       25      53 # <--- Return time = 25 as answer for Group 2 !
3       5       45
3       10      58 # <--- Return time = NA as answer for group 3 !

一个选项是使用rleid根据“速度”中的逻辑创建分组变量,并过滤行数n等于3且所有“速度”大于35的行

library(dplyr)
library(data.table)
df1 %>%
  group_by(Group, grp = rleid(Speed > speed_threshold)) %>%
  filter(n() >= 3, all(Speed > speed_threshold)) %>%
  slice(1:3)

如果它高于阈值,并且是一行中的第三个这样的值,则在末尾捕获索引。选择ends中的第一个索引并添加一个以获取返回时间的索引。可能有1个以上的此类3组,因此有一个以上的端部元件。在这种情况下,需要使用第一个端点

注意:在您的示例中,返回时的速度始终高于阈值。这段代码根本不检查这一点,只是给出速度高于阈值的三行之后的第一次,而不管当时的速度是否仍高于阈值

library(data.table)
setDT(df)

speed_thresh <- 35

df[, {above <- Speed > speed_thresh
      ends <- which(above & rowid(rleid(above)) == 3)
      .(Return_Time = Time[ends[1] + 1])}
   , Group]


#    Group Return_Time
# 1:     1          35
# 2:     2          25
# 3:     3          NA
使用的数据:

df <- fread('
Group   Time    Speed
1       5       25
1       10      23
1       15      21
1       20      40 
1       25      42 
1       30      52 
1       35      48 
1       40      45
2       5       22
2       10      36 
2       15      38 
2       20      46 
2       25      53 
3       5       45
3       10      58 
')
1使用末尾注释中重复定义的DF,定义一个函数ok,该函数取一个逻辑向量,指示速度是否大于35,并返回一个长度相同的逻辑向量,该逻辑向量对于3个连续真值之后的第一个速度为真。使用ave和子集DF将其应用于每个组,并将那些为真的行向下,给出s

如果只返回满足条件的群是充分的,那么我们就完成了;否则,将组定义为一列数据帧,每个组一行,并将其与s合并,以便为不满足条件的组获得NA

library(zoo)

ok <- function(x) cumsum(rollapplyr(x, list(-(1:3)), all, fill = FALSE)) == 1
s <- subset(DF, ave(Speed > 35, Group, FUN = ok))

Groups <- data.frame(Group = unique(DF$Group))
merge(Groups, s, all.x = TRUE)[1:2]
##   Group Time
## 1     1   35
## 2     2   25
## 3     3   NA
笔记
如果出现这种情况,我们选择前三个连续速度>=35谢谢!主要的任务是在下一个时间戳中获取时间值。感谢您提供了简单的解决方案:data.table的旧版本没有函数rowid,我如何用其他函数替换rowid,我尝试了seq_和其他方法来获取行号,但无法实现。在这种情况下,您可以使用此函数代替rowid2。例如,我如何在特定窗口中执行此操作,我想在一个窗口内搜索大于阈值的连续数字,即从所有组中的第三个元素到最后一个元素?这很有效,非常感谢,我实际上正在努力获得三个连续样本后下一个时间戳中的时间值,这在下一个答案中也得到了解决。感谢您的快速回复:
library(zoo)

calc <- function(x) {
  r <- rollapplyr(x$Speed > 35, list(-(1:3)), all, fill = FALSE)
  c(which(cumsum(r) == 1), NA)[1]
}
sapply(split(DF, DF$Group), calc)
##  1  2  3 
## 35 25 NA 
Lines <- "Group   Time    Speed
1       5       25
1       10      23
1       15      21
1       20      40 # Speed > 35
1       25      42 # Speed > 35
1       30      52 # Speed > 35
1       35      48 # <--- Return time = 35 as answer for Group 1 !
1       40      45
2       5       22
2       10      36 # Speed > 35
2       15      38 # Speed > 35
2       20      46 # Speed > 35
2       25      53 # <--- Return time = 25 as answer for Group 2 !
3       5       45
3       10      58 # <--- Return time = NA as answer for group 3 !"
DF <- read.table(text = Lines, header = TRUE)