【问题标题】:How to check if the value "TRUE" occurs consecutively for x number of times in R?如何检查值“TRUE”是否在 R 中连续出现 x 次?
【发布时间】:2021-07-20 13:00:33
【问题描述】:

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

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

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

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

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

我认为这很容易,但我无法弄清楚这一点并且已经卡了一段时间。特别是因为需要满足“x”次或更高的条件。

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

感谢任何帮助。

【问题讨论】:

    标签: r string-matching replicate


    【解决方案1】:

    更新

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

    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"
    
    

    【讨论】:

    • 这行得通,谢谢。但是,如果要对超过 100 个逻辑向量执行此操作,您将如何修改代码以输出哪个向量具有 4 个或更多连续 TRUE 值。
    【解决方案2】:

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

    # 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
    

    【讨论】:

    • 非常感谢,这更容易了。但同样,我的数据非常庞大。如何仅提取具有该模式的索引。在您的示例中,答案将是 v1 和 v3,而不打印整个逻辑列表。
    • @learning_to_code 那么你只需要names(ix)[ ix ]。见编辑。
    • @learning_to_code 根据您的示例数据和我的示例数据,这可以正常工作。请使用与您的真实数据相匹配的更好的示例数据更新您的帖子。
    • 对不起,因为我在函数中使用它,我只需要打印 ix,不带名称就可以了。非常感谢您的帮助!
    猜你喜欢
    • 2021-06-17
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多