首页 文章

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

提问于
浏览
2

我想删除包含零的所有行,但仅限于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 回答

  • 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)
    
  • 3

    这是使用 laglead 函数的 dplyr 方法:

    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

    1) rollapply 这使用动物园包中的 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 此解决方案不使用任何包 . 对于此示例, embed 形成一个10 x 3矩阵,其行包含连续的三元组(连续两个,末尾为行的零),并从中计算逻辑矩阵并将 any 应用于每一行:

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

相关问题