我有两个带二进制值的向量,表示有关某些数据向量的信息。第一个向量标识数据向量的某个元素是否被破坏。第二个向量标识其他元素受影响的扩展,因此也被破坏。矢量看起来像这样。
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)
我可以通过为每个self_broken元素向上使用循环来实现这一点,将元素标记为破坏直到命中起始点。但这对我来说似乎效率低下。
解决这个问题的正确方法是什么?
答案 0 :(得分:3)
像这样:
ave(itself_broken, cumsum(startpoint), FUN = any)
答案 1 :(得分:2)
使用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
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