如果在列R中不再为真,则在一行中找到一个值

时间:2013-03-26 19:08:23

标签: r

这应该很简单,但是尽管看起来很难让我很难过。

我的数据框的列值为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更改为FALSEFALSE更改为TRUE(行t3 8 FALSE和{{ 1}})。

似乎t6 5 TRUE会这样做,但我无法弄清楚如何更改部分。

3 个答案:

答案 0 :(得分:2)

您可以使用diff计算一个值与下一个值之间的差异,因为TRUEFALSE只是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然后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

答案 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)], ]