删除包含零的data.frame行,其中相邻的行包含零

时间:2014-10-20 07:48:37

标签: r

我想删除所有包含零的行,但仅限于if(下面的行为零且其上方的行也为零)或(它是零并且它是第一个观察值和下面的数字它也是零)。

例如:

RowNumb   Column2  
  1          0  
  2          0  
  3          0  
  4          1   
  5          0  
  6          1    
  7          1  
  8          0  
  9          0   
  10         0

我想删除第1,2,9和10行,因为这些行是唯一等于零的行,其下方为零,零或零(在rowNumb的情况下) 1)在他们之上,这样我得到以下内容:

RowNumb   Column2  
  3          0  
  4          1   
  5          0  
  6          1    
  7          1  
  8          0  

有没有人知道如何在不使用循环的情况下执行此操作?

3 个答案:

答案 0 :(得分:4)

您可以使用filter将每个绝对值与前后绝对值相加,并将该和与0进行比较:

DF <- read.table(text="RowNumb   Column2  
  1          0  
  2          0  
  3          0  
  4          1   
  5          0  
  6          1    
  7          1  
  8          0  
  9          0   
  10         0", header=TRUE)

rem <- na.omit(filter(abs(c(0, DF$Column2, 0)), rep(1, 3)) != 0L)

DF[rem,]
#  RowNumb Column2
#3       3       0
#4       4       1
#5       5       0
#6       6       1
#7       7       1
#8       8       0

这假定没有NA个值。如果可能发生这种情况,您需要稍微修改一下:

x <- c(0, DF$Column2, 0)         
rem <- na.omit(filter(x != 0L | is.na(x) , rep(1, 3)) != 0L)

答案 1 :(得分:3)

这是使用dplyrlag函数的lead方法:

require(dplyr)
df %>% filter(!(Column2 == 0 & lag(Column2, default = 0) == 0 & lead(Column2,default = 0) == 0))
#  RowNumb Column2
#1       3       0
#2       4       1
#3       5       0
#4       6       1
#5       7       1
#6       8       0

答案 2 :(得分:2)

1)rollapply 这使用来自zoo包中的rollapply来检查连续三个中的任何一个(并且因为partial=TRUE两端连续两个)不是零:

library(zoo)

DF[ rollapply(DF$Column2 != 0, 3, any, partial = TRUE), ]

,并提供:

  RowNumb Column2
3       3       0
4       4       1
5       5       0
6       6       1
7       7       1
8       8       0

1a)此变体也有效:

DF[ rollapply(c(0, DF$Column2, 0) != 0, 3, any), ]

2)嵌入此解决方案不使用任何软件包。对于此示例,embed形成一个10 x 3矩阵,其行包含连续的三元组(连续两个,末尾为行的零),并从中计算逻辑矩阵并将any应用于每一行:

DF[apply(embed(c(0, DF$Column2, 0) != 0, 3), 1, any), ]