如何检查值 "TRUE" 是否在 R 中连续出现 x 次?
How to check if the value "TRUE" occurs consecutively for x number of times in R?
我正在尝试为 R 中的每个组查找 'x' 或更多连续缺失的日期。
我目前的方法包括:
- 对每个组使用 for 循环
- 查找缺失的日期
- 找出这些缺失日期中有多少是连续的(这里我得到一个逻辑向量,表示缺失日期是否连续。
这就是我卡住的地方。如果“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
我正在尝试为 R 中的每个组查找 'x' 或更多连续缺失的日期。 我目前的方法包括:
- 对每个组使用 for 循环
- 查找缺失的日期
- 找出这些缺失日期中有多少是连续的(这里我得到一个逻辑向量,表示缺失日期是否连续。
这就是我卡住的地方。如果“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