如何选择不间断的号码?

时间:2012-10-08 22:30:24

标签: r selection

我有两个向量:

x<-c(0,1,0,2,3,0,1,1,0,2)
y<-c("00:01:00","00:02:00","00:03:00","00:04:00","00:05:00",
     "00:06:00","00:07:00","00:08:00","00:09:00","00:10:00")

我只需选择y中的xy x 00:04:00 2 00:05:00 3 00:07:00 1 00:08:00 1 的值不会被0中断。因此,我希望获得这样的数据框

df<-rbind(bbb,df)

我们构建了这样的脚本,但是使用大数据集需要时间。有更优雅的解决方案吗?我想知道,为什么aaa<-data.frame(y,x) df<-NULL for (i in 1:length(aaa$x)){ bbb<-ifelse((aaa$x[i]*aaa$x[i+1])!=0, aaa$x[i], ifelse((aaa$x[i]*aaa$x[i-1])!=0, aaa$x[i], NA)) df<-rbind(bbb,df) } df<-data.frame(rev(df)) aaa$x<-df$rev.df. bbb<-na.omit(aaa) bbb 返回倒df?

{{1}}

我是R的新手,所以请尽可能多详细:)谢谢!

1 个答案:

答案 0 :(得分:2)

aaa <- data.frame(y,x)
rles <- rle(aaa$x == 0)
bbb <- aaa[rep(rles$values == FALSE & rles$lengths >= 2, rles$lengths),]

给出了

> bbb
         y x
4 00:04:00 2
5 00:05:00 3
7 00:07:00 1
8 00:08:00 1

您遇到的子问题:df<-rbind(bbb,df)返回df,因为您要在其余(现有)行之前添加新行(bbb);反转参数的顺序,你不需要反转df

现在要打破答案,因为它涉及很多部分。首先,重新描述您的标准,您希望延伸的aaa至少有2行没有0。所以第一个标准是找到0的

> aaa$x == 0
 [1]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE

然后你想弄清楚这些延伸的长度; rle这样做。

> rle(aaa$x == 0)
Run Length Encoding
  lengths: int [1:8] 1 1 1 2 1 2 1 1
  values : logi [1:8] TRUE FALSE TRUE FALSE TRUE FALSE ...

这意味着有1 TRUE,然后是1 FALSE,然后是1 TRUE,然后是2 FALSE s等。此结果已分配给{{1} }。您想要的部分是值rles(不是0),并且该运行的长度是2或更多。

FALSE

这需要扩展回> rles$values == FALSE & rles$lengths >= 2 [1] FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE 的长度,aaa会这样做,使用rep复制相应的条目。

rles$lengths

这给出了适合索引> rep(rles$values == FALSE & rles$lengths >= 2, rles$lengths) [1] FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE FALSE FALSE

的逻辑向量
aaa