我有两个向量:
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. 现在要打破答案,因为它涉及很多部分.首先,重新描述你的标准,你想要至少2行没有0的aaa延伸.所以第一个标准是找到0
> aaa$x == 0
[1] TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE
然后你想弄清楚每个延伸的长度;这样做.
> 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等.这个结果被分配给rles.您想要的部分是值为FALSE(不为0),并且该运行的长度为2或更多.
> rles$values == FALSE & rles$lengths >= 2
[1] FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE
这需要扩展回aaa的长度,rep将使用rles $length来复制相应的条目.
> 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