在R中按组查找三个大于阈值的连续数字
我如何获得其先前样本连续且在组中大于固定阈值的样本的索引 在下面的示例中,我需要找到连续3个采样的时间,其速度大于35速度>=35分组在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
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)