2

これは非常に単純なはずですが、見ているのに苦労しています。

列値がa、b、cのデータフレームがあります

a   b   c
t1  10  TRUE
t2   9  TRUE
t3   8  FALSE
t4   7  FALSE
t5   6  FALSE
t6   5  TRUE
t7   4  TRUE
t8   3  TRUE

TRUEcがからFALSEまたはFALSEに変わるデータフレームの行を取得する必要がありますTRUE(行t3 8 FALSEt6 5 TRUE)。

これを行うようifelseに思えますが、変更部分の実行方法を理解するのに苦労しています。

4

3 に答える 3

2

とは1と0diffであるため、ある値と次の値の差を計算するを使用できます。から移動すると-1になり、から移動すると1になり、TTまたはFFの場合は次のようになります。 0.次に、これを使用して、行の選択に使用してデータフレームをサブセット化できます。それは1行に要約されます(私はあなたのデータフレームと呼びます)...TRUEFALSETRUEFALSEFALSETRUEwhichdf

df[ which( diff( df$c ) != 0 ) + 1 , ]
#   a b     c
#   3 t3 8 FALSE
#   6 t6 5  TRUE
于 2013-03-26T19:16:05.223 に答える
2

xor論理演算のタスクのようです。xor操作は次のようになります。

#       x     y   xor
# 1  TRUE  TRUE FALSE
# 2  TRUE FALSE  TRUE
# 3 FALSE  TRUE  TRUE
# 4 FALSE FALSE FALSE

これを使用して、を取得df$cし、次に、を使用するxorc(NA, head(df$c, -1))、後者はのシフトバージョンであり、次のdf$cようになります。

#       x     y   xor
# 1  TRUE    NA    NA
# 2  TRUE  TRUE FALSE
# 3 FALSE  TRUE  TRUE
# 4 FALSE FALSE FALSE
# 5 FALSE FALSE FALSE
# 6  TRUE FALSE  TRUE
# 7  TRUE  TRUE FALSE
# 8  TRUE  TRUE FALSE

そして、ここでは、であるエントリが必要ですTRUE。それで、

df[with(df, xor(c, c(NA, head(c, -1))) %in% TRUE), ]

#    a b     c
# 3 t3 8 FALSE
# 6 t6 5  TRUE

さらに良いことに、次の使用を排除できNAます%in%

df[with(df, xor(c, c(c[1], head(c, -1)))), ]

#    a b     c
# 3 t3 8 FALSE
# 6 t6 5  TRUE
于 2013-03-26T19:58:50.847 に答える
1

次にrle例を示します。

set.seed(110)
df <- data.frame( a = sample.int(10 , 10 ) , b = sample( c( TRUE , FALSE ) , 10 , repl = TRUE ) )

rles <- rle(df$b)
take <- cumsum(rles$lengths) + 1

df[take[-length(take)], ]
于 2013-03-26T20:53:59.803 に答える