You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:45:00