首页 > 解决方案 > 如何计算一个条件为真的次数,直到它在 r 中平均不为真?

问题描述

我正在尝试梳理股票数据,我通常使用 Java,但对于我最终构建的内容来说还不够好。在 R 中,我如何检查一个条件平均有多少次为真,直到其为假,所以 if X> 10 = true if x < 10 = false

x > 10 多少次直到它低于

标签: r

解决方案


我最近才开始使用 R 并且(如果我正确理解了您的问题)我遇到了类似的问题。

首先,我生成一个包含 0 到 20 之间随机值的 1000 个元素的样本(我选择 20 只是因为您的条件是 <> 10,因此我将 10 作为中间点)

library(dplyr)
x <- data.frame(n=runif(1000, min = 0, max = 20), group = 0)
> x
#               n group
#1    18.01267749     0
#2     8.50561210     0
#3    11.26424876     0
#4     1.22902009     0
#5    17.37173610     0
#6    15.79453081     0
#7     4.84231228     0
#8     1.36992180     0
#9     2.16605579     0
#10   16.51773243     0
...

我不确定你的具体意思是什么,但我会尝试解决两个问题:1-计算有多少行满足某个条件,有多少行不满足。2-检查有多少连续“行”满足某个条件,直到不再满足该条件。

现在对于第一种情况,使用 for 循环以“编程”方式思考:

res2 <- c(0,0)
for(i in 1:nrow(x)){
  if(x[[i,"n"]] > 10)
    res2[1] <- res2[1]+1
  else
    res2[2] <- res2[2]+1
}
#> res2
#[1] 494 506

当然还有一种更好更快的方法,“R”方式:

res <- x %>%
    group_by(group = if_else(x$n > 10, 1, 0)) %>%
    summarise(total = n())
# A tibble: 2 x 2
#  group total
#  <dbl> <int>
#1     0   506
#2     1   494

思路很简单:将所有值 >10 的行放在一个组中(用 1 标识,将n<10 的行放在另一个用 0 标识的组中),然后用变量分组,group最后统计两组的总行数.

现在是第二种情况,如果没有合适的工具,这会稍微困难一些。实际上,当时我花了一段时间才在不使用 for 循环的情况下找到正确的答案。

这个想法是使用rle或游程编码:

x$group <- with(rle(x$n < 10), rep(seq_along(lengths), lengths))
#> x
#               n group
#1    18.01267749     1
#2     8.50561210     2
#3    11.26424876     3
#4     1.22902009     4
#5    17.37173610     5
#6    15.79453081     5
#7     4.84231228     6
#8     1.36992180     6
#9     2.16605579     6
#10   16.51773243     7
#11    2.22784827     8
#12   19.44676961     9
#13    1.28190206    10
#14   15.93426880    11
#15   16.70963107    11
#16    5.01572254    12

rle只要条件结果发生变化,就会生成一个新的组索引。因此,如果一行中有 3 个值均 < 10,则它们都将具有相同的组索引,但是一旦某个值不再满足条件,组索引就会增加。

您可以在示例中注意到,第 5-6 行均 >10,并且它们的组具有索引5,但第 7 行是 <10,因此新组索引为6,依此类推...

现在,由于每次条件结果更改时组索引都会更改,因此为了知道它确实更改了多少次,您可以获取最大的组索引并除以 2。

> max(x$group)/2
# [1] 242

您可以通过以下方式进行测试:

runLength <- rle(x$n < 10)$values
res <- length(runLength[runLength == TRUE])
#> res
#[1] 242

推荐阅读