如何检查值 "TRUE" 是否在 R 中连续出现 x 次?

How to check if the value "TRUE" occurs consecutively for x number of times in R?

我正在尝试为 R 中的每个组查找 'x' 或更多连续缺失的日期。 我目前的方法包括:

这就是我卡住的地方。如果“TRUE”连续出现 'x' 次或更多次,如何从逻辑向量进行检查。

logical_vector <- c("TRUE", "TRUE", "TRUE", "FALSE", "TRUE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE")

例如,在上面的向量中,如何检查值“TRUE”是否连续出现 4 次或更多次?

我认为这是一件很容易的事情,但我想不通,已经卡了一段时间了。特别是因为需要满足'x'次或更高的条件。

如果确实出现了 4 次或更多次,我们是否也应该将其存储为逻辑向量?

感谢任何帮助。

已更新

您也可以使用以下代码来达到您的目的。我知道已经提出了一个非常好的解决方案,但是,我不想让我的解决方案未完成:

library(dplyr)
library(purrr)

# First I created a data frame of logical values

logical_vector <- c("TRUE", "TRUE", "TRUE", "FALSE", "TRUE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE")
logical_vector2 <- c("TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE")
logical_vector3 <- c("TRUE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "TRUE", "FALSE", "TRUE", "TRUE")
logical_vector4 <- c("FALSE", "FALSE", "TRUE", "FALSE", "TRUE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE")

df <- data.frame(logical_vector, 
                 logical_vector2,
                 logical_vector3,
                 logical_vector4)

df %>%
  mutate(across(everything(), as.logical)) -> df


# Then I apply `rle` function on every column of it and count the runs of TRUEs among them and finally keep the elements with runs of TRUEs more than 4


map(df, rle) %>%
  map(~ .x$lengths[.x$values]) %>%
  keep(~ max(.x) > 4) -> df1

names(df1)
[1] "logical_vector2"

将逻辑值保持为逻辑值,而不是字符串,并将所有向量保存在一个列表中,然后我们可以循环遍历它们以获得符合条件的索引,请参见示例:

# example list of logical vectors 
l <- list(
  v1 = c(TRUE, TRUE, TRUE, FALSE, TRUE,  FALSE, TRUE,  TRUE, TRUE, TRUE),
  v2 = c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE),
  v3 = c(TRUE, TRUE, TRUE, TRUE,  TRUE,  FALSE, FALSE, TRUE, TRUE, TRUE))

# get index vector with 4 consequitive TRUE
ix <- sapply(l, function(i){
  r <- rle(i) 
  any(r$lengths[ r$values ] >= 4)
  })

#get the names of vectors
names(ix)[ ix ]
#[1] "v1" "v3"

# subset if needed
l[ ix ]
# $v1
# [1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
# 
# $v3
# [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE