我有一个数据框:

dt <- read.table(text = "
350 16
366 11
376  0
380  0
397  0
398 45
400 19
402 0
510 0
525 0
537 0
549 0
569 112
578 99")

我想删除除非零值前后的行之外的第二列中所有带零的行。

结果将是:
dt1 <- read.table(text = "
350 16
366 11
376  0
397  0
398 45
400 19
402 0
549 0
569 112
578 99")

最佳答案

library(data.table)
setDT(dt)

dt[{n0 <- V2 != 0; n0 | shift(n0) | shift(n0, type = 'lead')}]
#or
dt[(n0 <- V2 != 0) | shift(n0) | shift(n0, type = 'lead')] # thanks @Frank

#      V1  V2
#  1: 350  16
#  2: 366  11
#  3: 376   0
#  4: 397   0
#  5: 398  45
#  6: 400  19
#  7: 402   0
#  8: 549   0
#  9: 569 112
# 10: 578  99

编辑:

现在 data.table::shift 接受带有一些负元素和一些正元素的向量,您可以改用下面的代码
dt[Reduce('|', shift(V2 != 0, -1:1))]

关于r - 在条件下删除零值的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52432386/

10-08 22:03