我有两个向量:
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
,y 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的新手,所以请尽可能多详细:)谢谢!
答案 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