3

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

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)

我可以通过对每个向上的 selfs_broken 元素使用循环来实现这一点,将元素标记为已损坏,直到到达起点。但这对我来说似乎效率很低。

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

4

2 回答 2

3

像这样:

ave(itself_broken, cumsum(startpoint), FUN = any)
于 2013-03-19T23:55:42.463 回答
2

使用aggregatecumsum

> 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

cs标识组

> agg <- aggregate(itself_broken, by=list(group=cs), FUN=any)
> agg
  group     x
1     1 FALSE
2     2  TRUE
3     3  TRUE

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
于 2013-03-19T23:28:24.407 回答