2012-04-16 74 views
1

我有一個很長的數據幀,我想查找序列的結束和開始。簡化查找數據幀中序列的開始和結束

b = c("a","c","a","c","e", "a","c","a","c","a" ,"c","a","c","a","c" ,"d","d","d","d","d") 
a = c(0,0,0,0,1, 4,0,0,0,0, 5,1,6,0,0, 0,10,0,0,0) 
df = data.frame(a,b) 

我想要的是一種方法來找到所有的非零到0和0到非零轉換。

我已經通過使用lapply來調用一個函數並保存上一次調用的值。

我正在尋找更優雅的東西,讓我看看N行和N + 1行,或者更好的行N行N + M在我的功能或更好的東西。

+2

您可以通過rle(Data $ a == 0)找到它們,但根據您的最終目標,可能會有更有用的方法對序列進行分組。 – 2012-04-16 14:37:54

+0

詳細闡述Joshua的評論:'Data $ a == 0'返回0爲邏輯1,其他所有返回邏輯0,從而使'rle'的輸出完全符合你的要求。 – 2012-04-16 17:29:17

回答

0

也許這就是你想要的?它可能不夠優雅,但它應該檢測您描述的轉換。

> lagn <- function(x, n) { c(rep(NA,n), x[1:(length(x)-n)]) } 
> df$c <- lagn(df$a, 1) 
# mult ensures one of the item is zero, add ensures one of the item was nonzero 
> df[which((df$a*df$c)==0 & (df$a+df$c)!=0),] 
    a b c 
5 1 e 0 
7 0 c 4 
11 5 c 0 
14 0 a 6 
17 10 d 0 
18 0 d 10 
相關問題