如何找到向量中的第一个非零元素、最后一个非零元素以及对向量进行修剪(trim)操作。

3

I have a data frame:

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

我希望能够消除数据框中在“q”列的第一个非零索引之前和最后一个非零索引之后的行。 在上述情况下,结果应如下所示:
  00:30 100 0.25
  00:45   0 0.25
  01:00   0 0.25
  01:15 100 0.25

如何最好地完成这个任务?

2个回答

6
你可以使用 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

请参见编辑。我不想删除所有值为零的行,只想删除第一个非零值之前和最后一个非零值之后的行。 - user3022875
@user3022875 我没有删除所有值为零的行。请检查代码。 - akrun
1
如果所有条目都为零(因此indx为“integer(0)”),则会引发错误。不过,这并不是什么大问题;在这种情况下,让用户看到错误可能是最好的选择。 - Frank
@Frank 在这种情况下,我们需要添加一个带有 sum 或类似的条件。 - akrun

0

这是我的建议。

d[d$q!=0,]

请参见编辑。我不想删除所有值为零的行,只想删除第一个非零值之前和最后一个非零值之后的行。 - user3022875

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接