2012-04-16 72 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 
相关问题