次のような論理配列がある場合
x = c(TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE)
上記の例で最も内側の TRUE を取得する最も簡単な方法は、インデックス 2 とインデックス 6 です。
次のような論理配列がある場合
x = c(TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE)
上記の例で最も内側の TRUE を取得する最も簡単な方法は、インデックス 2 とインデックス 6 です。
問題が明確に定義されているかどうかはわかりませんが、この特定のケースでrle
は、必要なものが得られます。
> rle(x)$lengths[1]
[1] 2
> rle(x)$lengths[1]+rle(x)$lengths[2]+1
[1] 6
これはより堅牢である可能性がありますか?true と false が 2 回以上入れ替わると機能しrle
ません。
# you could try it on the original vector..
# x <- c(TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE)
# ..but it also works on a more scattered vector
x <- c(TRUE, FALSE , TRUE, FALSE, FALSE, FALSE, FALSE , TRUE, TRUE, TRUE)
# find the position of all TRUEs
true.positions <- which( x )
# find the midpoint of the vector
midpoint <- length( x ) / 2
# find the smallest distance from the midpoint,
small.dist <- ( true.positions - midpoint )
# both above and below
small.dist.above <- min( small.dist[ small.dist >= 0 ] )
small.dist.below <- abs( max( small.dist[ small.dist <= 0 ] ) )
# find the lowest position above the midpoint
lpa <- which( small.dist.above == true.positions - midpoint )
# find the highest position below the midpoint
hpb <- which( small.dist.below == midpoint - true.positions )
# if both are the midpoint, combine them
closest.trues <- unique( c( hpb , lpa ) )
# return the position in the original vector x
# of the innermost TRUE
true.positions[ closest.trues ]