这应该很简单,但是尽管看起来很难让我很难过。
我的数据框的列值为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
我需要获取数据框中的行,其中c从TRUE
更改为FALSE
或FALSE
更改为TRUE
(行t3 8 FALSE
和{{ 1}})。
似乎t6 5 TRUE
会这样做,但我无法弄清楚如何更改部分。
答案 0 :(得分:2)
您可以使用diff
计算一个值与下一个值之间的差异,因为TRUE
和FALSE
只是1和0.如果您从TRUE
转到FALSE
你得-1,如果你从FALSE
转到TRUE
你得到1,如果它只是TT或FF那么它就是0.你可以用它来使用which
对数据框进行子集化以选择行。归结为一行(我称之为数据框df
)...
df[ which( diff( df$c ) != 0 ) + 1 , ]
# a b c
# 3 t3 8 FALSE
# 6 t6 5 TRUE
答案 1 :(得分:2)
似乎是xor
逻辑操作的任务。 xor
操作提供:
# x y xor
# 1 TRUE TRUE FALSE
# 2 TRUE FALSE TRUE
# 3 FALSE TRUE TRUE
# 4 FALSE FALSE FALSE
使用此功能,如果我们将df$c
然后xor
与c(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
答案 2 :(得分: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)], ]