如何在R语言data.frame列中正确匹配指定布尔值序列
问题原因
你当前代码的逻辑错误来自于%in%运算符的作用:它仅判断sample中的单个元素是否在目标列中存在,不要求元素连续出现、也不要求和sample的顺序完全匹配。你的sample全为TRUE,只要列里存在TRUE就会返回TRUE,自然三列结果都是TRUE。
正确实现方案
1. 纯Base R实现(无需安装额外包)
我们可以通过滑动窗口的逻辑,逐个比对目标列中所有长度和sample相等的连续子序列,判断是否存在完全匹配的项:
# 定义判断向量是否包含目标连续序列的工具函数 has_matched_sequence <- function(x, target_seq) { seq_len <- length(target_seq) x_len <- length(x) # 目标序列比待匹配向量长时直接返回FALSE if (seq_len > x_len) return(FALSE) # 滑动检查所有长度符合的连续子序列 any(sapply(1:(x_len - seq_len + 1), function(i) { all(x[i:(i + seq_len - 1)] == target_seq) })) } # 你的原数据 sample <- rep(TRUE, 3) df <- data.frame( test1 = rep(c(TRUE, FALSE, TRUE, TRUE), 3), test2 = rep(c(TRUE, FALSE, FALSE, TRUE), 3), test3 = rep(c(TRUE, FALSE, FALSE, FALSE), 3) ) # 逐列检查 lapply(df, has_matched_sequence, target_seq = sample)
运行后输出结果符合预期:
$test1 [1] TRUE $test2 [1] FALSE $test3 [1] FALSE
2. 借助zoo包的简洁实现
如果允许使用第三方包,zoo的滑动计算函数rollapply可以简化代码:
# 首次使用时先执行安装:install.packages("zoo") library(zoo) lapply(df, function(col) { any(rollapply(col, width = length(sample), FUN = identical, sample)) })
运行结果和Base R实现完全一致。
内容的提问来源于stack exchange,提问作者saQuist
相关产品推荐
相关产品推荐

