如何只选择不间断的号码? [英] How to choose non-interruped numbers only?

查看:16
本文介绍了如何只选择不间断的号码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个向量:

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中的值,其中x的值不会被0中断。因此,我希望得到这样的数据帧

y        x
00:04:00 2
00:05:00 3
00:07:00 1
00:08:00 1

我们构建了一个这样的脚本,但对于大型数据集,这需要时间。有没有更优雅的解决方案?我想知道,为什么df<-rbind(bbb,df)返回倒置的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

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

推荐答案

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 ...

这意味着有1TRUE,然后是1FALSE,然后是1TRUE,然后是2FALSE,依此类推。这个结果被分配给rles。您需要的部分的值是FALSE(不是0),并且该运行的长度是2或更长。

> 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

> aaa[rep(rles$values == FALSE & rles$lengths >= 2, rles$lengths),]
         y x
4 00:04:00 2
5 00:05:00 3
7 00:07:00 1
8 00:08:00 1

这篇关于如何只选择不间断的号码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆