如何选择唯一的非interruped号码?(How to choose non-interruped

2019-09-23 17:21发布

我有两个向量:

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的新手,所以,请尽可能多的细节你可以:)谢谢!

Answer 1:

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没有0的至少2行。 因此,第一个条件是找到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,等。该结果被分配给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


文章来源: How to choose non-interruped numbers only?
标签: r selection