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))]