Algorithm 使用来自第二个向量的分组对向量执行布尔运算

Algorithm 使用来自第二个向量的分组对向量执行布尔运算,algorithm,r,boolean,grouping,Algorithm,R,Boolean,Grouping,我有两个带二进制值的向量,它们表示关于某个数据向量的信息。第一个向量标识数据向量的某个元素是否被破坏。第二个向量标识其他元素受影响的范围,因此也会被破坏。向量是这样的 itself_broken = c(FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE) startpoint = c(TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE) 现在,我想找到以下意义上的所有断开元素:如果两个起

我有两个带二进制值的向量,它们表示关于某个数据向量的信息。第一个向量标识数据向量的某个元素是否被破坏。第二个向量标识其他元素受影响的范围,因此也会被破坏。向量是这样的

itself_broken = c(FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE)
startpoint = c(TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE)
现在,我想找到以下意义上的所有断开元素:如果两个起始点之间的一个元素断开,那么这两个起始点(包括左起始点)之间的所有其他元素也断开。因此,在上述示例中,结果向量应为:

all_broken = c(FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE)
我可以通过使用一个循环来实现这一点,循环中的每个元素都是向上的,标记元素为已断开的,直到到达起始点为止。但我觉得这真的很低效


解决这个问题的正确方法是什么?

使用
aggregate
cumsum

> itself_broken <- c(F,F,F,F,T,F,T,F)
> startpoint <- c(T,F,F,T,F,T,F,F)
> cs <- cumsum(startpoint)
> cs
[1] 1 1 1 2 2 3 3 3
agg
告知哪些组已断开。现在将其与原始数据合并:

> merge(data.frame(group=cs, sp=startpoint, it=itself_broken), agg)
  group    sp    it     x
1     1  TRUE FALSE FALSE
2     1 FALSE FALSE FALSE
3     1 FALSE FALSE FALSE
4     2  TRUE FALSE  TRUE
5     2 FALSE  TRUE  TRUE
6     3  TRUE FALSE  TRUE
7     3 FALSE  TRUE  TRUE
8     3 FALSE FALSE  TRUE
像这样:

ave(itself_broken, cumsum(startpoint), FUN = any)

为什么
本身被破坏了
起始点短
?请修复第一个代码段中的语法错误。为什么最后一个
all\u break
为TRUE,而它本身和start都为FALSE?你能稍微解释一下你的意思吗?在这个例子中,
startpoint
定义了三个组(因为我们有三个真值)。每组的大小分别为3、2和3。当组中的一个元素如
本身所示为假时,整个组应为假。
all_break
的最后一个元素也被破坏,因为它的组包含一个被破坏的元素(即组中的第二个元素,它是整个向量的第二个最后一个元素)。
ave(itself_broken, cumsum(startpoint), FUN = any)