微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何检查值“TRUE”是否在 R 中连续出现 x 次?

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

  • 对每个组使用 for 循环
  • 查找缺失的日期
  • 找出这些缺失日期中有多少是连续的(这里我得到了一个逻辑向量,说明缺失日期是否连续。

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

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

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

我认为这是一件非常简单的事情,但我无法弄清楚这一点,并且已经卡住了一段时间。特别是因为需要满足 'x' 次或更高的条件。

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

感谢任何帮助。

解决方法

更新

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

library(dplyr)
library(purrr)

# First I created a data frame of logical values

logical_vector <- c("TRUE","TRUE","FALSE","TRUE")
logical_vector2 <- c("TRUE","TRUE")
logical_vector3 <- c("TRUE","TRUE")
logical_vector4 <- c("FALSE","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,FALSE,TRUE),v2 = c(TRUE,v3 = c(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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。