当前位置: 首页 > 知识库问答 >
问题:

如何检测高于阈值的连续值?

甄云
2023-03-14

我有数据,我想应用滚动函数来检测哪个点的值大于特定阈值。

library(tidyverse)

df <- tibble(
  x = 1:10,
  y = c(1, 3, 4, 1, 5, 34, 43, 1, 45, 3)
)

df
#> # A tibble: 10 x 2
#>        x     y
#>    <int> <dbl>
#>  1     1     1
#>  2     2     3
#>  3     3     4
#>  4     4     1
#>  5     5     5
#>  6     6    34
#>  7     7    43
#>  8     8     1
#>  9     9    45
#> 10    10     3

我想要的是找到下一个2个值高于某个阈值(例如30)的行。这将产生以下结果:

tibble(
  x = 1:10,
  y = c(1, 3, 4, 1, 5, 34, 43, 1, 45, 3),
  i = c(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)
)
#> # A tibble: 10 x 3
#>        x     y i    
#>    <int> <dbl> <lgl>
#>  1     1     1 FALSE
#>  2     2     3 FALSE
#>  3     3     4 FALSE
#>  4     4     1 FALSE
#>  5     5     5 FALSE
#>  6     6    34 TRUE 
#>  7     7    43 FALSE
#>  8     8     1 FALSE
#>  9     9    45 FALSE
#> 10    10     3 FALSE

我有一个大的数据集(几百万行),所以我试图找到一个有效的解决方案。也许使用data.table由reprex包(v0.2.1)在2019-02-26创建

共有2个答案

麹正业
2023-03-14

< code>data.table来自@G .格罗滕迪克的tidyverse版本:

dt <- as.data.table(df)

thresh <- 30

dt[, i := y > thresh & shift(y, -1L, fill = FALSE) > thresh][]

     x  y     i
 1:  1  1 FALSE
 2:  2  3 FALSE
 3:  3  4 FALSE
 4:  4  1 FALSE
 5:  5  5 FALSE
 6:  6 34  TRUE
 7:  7 43 FALSE
 8:  8  1 FALSE
 9:  9 45 FALSE
10: 10  3 FALSE

i的较短表达式归功于@Henrik。我需要更新data.table才能使用它(旧版本不接受n参数的负值)

解阳泽
2023-03-14

1)使用< code>rollapply滚动每个连续的线对,检查它们是否都高于阈值:

library(dplyr)
library(zoo)

df %>% mutate(i = rollapply(y > 30, 2, all, align = "left", fill = FALSE))

# A tibble: 10 x 3
       x     y i    
   <int> <dbl> <lgl>
 1     1     1 FALSE
 2     2     3 FALSE
 3     3     4 FALSE
 4     4     1 FALSE
 5     5     5 FALSE
 6     6    34 TRUE 
 7     7    43 FALSE
 8     8     1 FALSE
 9     9    45 FALSE
10    10     3 FALSE

2)另一种方法是使用领导

df %>% mutate(i = y > 30 & lead(y) > 30)
 类似资料:
  • 我需要找到我的数据连续几天达到阈值的位置。我正在寻找超过阈值的4个连续观察值。我想返回符合这些标准的系列的第一个观察值的位置。 下面是一个数据集示例: 我想要平均符合标准的日期(平均 在这种情况下,我可以将第一种情况下的< code>TRUE作为答案,但如果第二种、第三种或第四种情况不是< code>TRUE,这将不起作用 我需要条件为的第一个日期: 以及该系列中第一个观察的位置: 我已经找到了相

  • 我已经准备了一个实现altbeacon库的服务,相关部分如下所示: 我从中看到信标并获得RSSI值的回调如下所示: 我有什么问题?运行该应用程序时,我注意到在didRangeBeaconsInRegion,我经常看不到所有的信标。 如何通过始终能够检测到所有信标来提高扫描频率? 使用的altbeacon版本: Android版本:9 谢谢

  • 我有以下R数据框架: …还有更多的行! 我想得到我有值的行数。 例如: 多少行显示值 列类型S.A和S.B相互排斥,因此永远不会选择Loc2、Loc3和Loc4,因为这些都显示值 我减少了列的数量,因此可以为进一步的选择手动预定义列索引(或名称),但是,我不知道如何处理来选择显示超过某个阈值的值的行,同时还对可能出现这些值的列添加约束。 欢迎任何建议! 干杯:)

  • 我被困在一个问题上,希望得到一些指导。我们希望生成一个报告,计算产品的连续日期(从用户提供的日期向后看)。数据集如下: 因此,我们想得出一份报告,该报告在2021年3月2日提供的日期如下所示: 尽管我正在努力编写查询,但我甚至不知道该怎么称呼它,因为我需要一个特定阈值上的连续值计数。我可以计算阈值以上的值,但不确定如何添加“连续数周”逻辑。

  • 当我查看注册表仪表板时,当结束时,我会看到以下警告消息: 当我查看代码时,测试始终为true 为什么是默认配置,它似乎怪异,因为它不断地产生一个警告! 如果有谁能给我一个解释。我想我错过了什么…

  • 问题内容: 我已经开始开发微服务,尽管我已经进行了一段时间的研究,同时阅读了Spring的文档和Netflix的文档。 我已经开始在Github上进行一个简单的项目。它基本上是一个Eureka服务器(Archimedes)和三个Eureka客户端微服务(一个公共API和两个私有)。查看github的自述文件以获取详细描述。 关键是,当一切都运行时,我希望如果其中一个私有微服务被杀死,Eureka服