2013-03-26 30 views
2

這應該是很簡單的,但它給了我一個困難時期,儘管找。找到一個行的值,如果它不再是真實的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的變化從TRUEFALSEFALSETRUE(行t3 8 FALSEt6 5 TRUE) 。

似乎是一個ifelse會做到這一點,但我有麻煩搞清楚如何做的修改部分。

+1

您好,因爲你似乎相當新來的話,我建議你閱讀[** SO約**](http://stackoverflow.com/about),也是[** **常見問題解答(http://stackoverflow.com/faq )關於SO如何解答問題並接受答案秒。 – Arun 2013-03-26 20:32:37

+1

什麼阿倫想說的是,StackOverflow的是由** **很多更有價值的所有人,如果當您收到解決您的問題的答案,您可以通過單擊小對勾接受它。您完全不承擔**的義務,但如果答案確實能夠解決您的問題,那麼這是「回饋」網站的好方法。 – joran 2013-03-26 20:51:37

+0

謝謝Arun和Jordon。將去看看,並確保我已經做到了這一點。謝謝。我曾經閱讀過,但往往事情並沒有停留在老人的大腦中。我會盡力注意細節,並欣賞評論。再次感謝你。 – 2013-03-27 17:12:39

回答

2

似乎是xor邏輯運算的任務。該xor操作給出:

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

利用這一點,如果我們採取df$c,然後用c(NA, head(df$c, -1))xor,後者是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 
+0

+1這種方法對我來說是新的。謝謝! – 2013-03-26 20:33:30

+1

'which'會在%TRUE' – mnel 2013-03-27 01:09:04

+0

爲'%替代哦,這完美!謝謝。 – 2013-03-27 17:24:39

2

你可以使用diff用於計算一個數值和未來之間的區別,因爲TRUEFALSE只是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 
+0

這工作!謝謝! – 2013-03-27 17:25:51

+0

@NatalieBjorklund非常歡迎你。 :-) – 2013-03-27 17:26:58

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)], ] 
相關問題