3

いくつかのデータベクトルに関する情報を表すバイナリ値を持つ2つのベクトルがあります。最初のベクトルは、データベクトルの特定の要素が壊れているかどうかを識別します。2番目のベクトルは、他の要素が影響を受け、したがって壊れている範囲を識別します。ベクトルは次のようになります。

itself_broken = c(FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE)
startpoint = c(TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE)

ここで、次の意味で壊れているすべての要素を見つけたいと思います。2つの開始点の間の1つの要素が壊れている場合、これら2つの開始点の間の他のすべての要素(左側の開始点を含む)も壊れています。したがって、上記の例では、結果のベクトルは次のようになります。

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

使用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
于 2013-03-19T23:28:24.407 に答える