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

我需要获取数据框中的行,其中 c 从TRUEFALSEFALSETRUE(行t3 8 FALSEt6 5 TRUE)变化。

似乎ifelse会这样做,但我无法弄清楚如何进行更改部分。

4

3 回答 3

2

似乎是xor逻辑运算的任务。该xor操作给出:

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

使用这个,如果我们取df$c然后xorwith 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
于 2013-03-26T19:58:50.847 回答
2

您可以使用diffwhich 计算一个值与下一个值之间的差异,因为TRUEandFALSE只是 1 和 0。如果从TRUEFALSE您得到 -1,如果从FALSETRUE您得到 1,如果它只是 TT 或 FF,它将是0. 然后您可以使用它来对您的数据框进行子集which化,以选择行。它归结为一行(我称之为你的数据框df)......

df[ which( diff( df$c ) != 0 ) + 1 , ]
#   a b     c
#   3 t3 8 FALSE
#   6 t6 5  TRUE
于 2013-03-26T19:16:05.223 回答
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 回答