我有一个数据框:
d<-data.frame(time = factor(c("00:00","00:15","00:30","00:45", "01:00","01:15","01:30","01:45","02:00","02:40" )), q=c(0,0,100,0,0,100,0,0,0,0),p=c(.25,.25,.25,.25,.25,.25,.25,.25,.25,.25))
d
time q p
1 00:00 0 0.25
2 00:15 0 0.25
3 00:30 100 0.25
4 00:45 0 0.25
5 01:00 0 0.25
6 01:15 100 0.25
7 01:30 0 0.25
8 01:45 0 0.25
9 02:00 0 0.25
10 02:40 0 0.25
我想消除数据帧的行,这些行是列#34; q&#34;的第一个非零索引之前的行。并且在列#34; q&#34;的最后一个非零索引之后。在上面的例子中,结果应如下所示:
00:30 100 0.25
00:45 0 0.25
01:00 0 0.25
01:15 100 0.25
最好的方法是什么?
答案 0 :(得分:3)
您可以使用which
indx <- which(d$q!=0)
d[indx[1L]:indx[length(indx)],]
# time q p
#3 00:30 100 0.25
#4 00:45 0 0.25
#5 01:00 0 0.25
#6 01:15 100 0.25
正如@Frank在评论中提到的,如果所有值都是'0',那么我们可能需要一个条件。在这种情况下,以下函数将返回整个数据集。
f1 <- function(dat, col){
if(sum(dat[,col])!=0){
indx <- which(dat[,col]!=0)
dat[indx[1L]:indx[length(indx)],]
}
else{
dat
}
}
f1(d, 'q')
# time q p
#3 00:30 100 0.25
#4 00:45 0 0.25
#5 01:00 0 0.25
#6 01:15 100 0.25
答案 1 :(得分:0)
这是我的建议。
d[d$q!=0,]