删除两个连续零之前和之后的所有值/行

时间:2017-05-30 23:33:47

标签: r matrix zero

让我说我有一个10x3矩阵m,我想检查第一列中的所有零和两个连续的零。我想删除第一列中包含零的所有行以及第一列中两个连续零之后的所有其他行,从矩阵中的某个点开始,并在或之前删除值连续两个零之后。

      col1 col2 col3
[1,]    2    2    2
[2,]    2    2    2
[3,]    2    2    2
[4,]    2    2    2
[5,]    2    0    2
[6,]    2    2    2
[7,]    2    0    2
[8,]    2    0    2
[9,]    2    2    2
[10,]   2    2    2

dput= structure(c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 
0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), .Dim = c(10L, 3L), .Dimnames = list(
NULL, c("col1", "col2", "col3")))


expected result=     col1 col2 col3
                [1,]    2    2    2
                [2,]    2    2    2

删除第1,2,3,4,5,6,7和8行。

1 个答案:

答案 0 :(得分:0)

我写了代码来解决以下规则:

规则A:删除任何列中包含零的行

规则B:删除任意列中连续零之前的所有行

1 2 3 4 5 6 7 8 9 10 # Row Number
2 2 2 2 0 2 0 0 2 2  # Column 2
* * * * * * * * 2 2  # * = Remove
B B B B C B A A - -  # Rule Why Removed

C A + B发生的地方。如果在第10行之后有以下行具有单个(非连续)零,则将删除它们。

这里我们删除了1:8。 这是我的方法:

dat <- structure(c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 
                  0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), .Dim = c(10L, 3L), .Dimnames = list(
                    NULL, c("col1", "col2", "col3")))
dat

ToRemove <- apply(dat, 2, function(colmn) {
  row.zeros <- which(colmn == 0) # rows with zeros
  if(length(row.zeros) > 0) { # if we found any
     # which of them is the last double
    last.doubles <- max(which(diff(row.zeros) == 1))
    leftof.last.doubles <- "if"(length(last.doubles) > 0, # if double exists
                                1:(row.zeros[last.doubles]-1), # all rows before
                                NULL) # else nothing
    # remove rows with single zeros and all rows before double consecutive 
    unique(c(row.zeros, leftof.last.doubles)) }
})

ToRemove
#$col1
#NULL
#
#$col2
#[1] 5 7 8 1 2 3 4 6
#
#$col3
#NULL

dat[-unlist(ToRemove),]
#     col1 col2 col3
#[1,]    2    2    2
#[2,]    2    2    2