Home > Mobile >  Delete specific columns
Delete specific columns

Time:04-03

I have

F <- structure(c(0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0), .Dim = c(3L, 
5L))

How can I remove from F the columns that have less than 2 consecutive zero? Thx!

CodePudding user response:

We may use rle to determine the consecutive values i.e. 0 and create a logical condition with lengths by looping over the column (apply, MARGIN = 2)

F[,!apply(F, 2, function(x) with(rle(!x), 
      any(lengths >= 2 & values))), drop = FALSE]

-output

      [,1] [,2]
[1,]    0    0
[2,]    1    1
[3,]    1    1

If it is the opposite, just remove the !

F[,apply(F, 2, function(x) with(rle(!x), 
      any(lengths >= 2 & values))), drop = FALSE]
      [,1] [,2] [,3]
[1,]    1    1    1
[2,]    0    0    0
[3,]    0    0    0

CodePudding user response:

A slightly different approach with rle applied over the columns:

F[, apply(F, 2, \(x) with(rle(x), any(lengths[values == 0] >= 2)))]

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    0    0    0
[3,]    0    0    0

CodePudding user response:

Using pure base, no extra functions, as one-liner:

U = F[, apply((F[-1,]==0) & (F[-nrow(F),]==0), 2, any)]

Breakdown:

U = F[                                   # Select...
   ,                                     # ...all the rows in the matrix...
   apply(                                # ...that have...
      (F[-nrow(F),]==0) & (F[-1,]==0),   # ...one value = 0 and the next value = 0
      2,                                 # ...in columns (i.e. 2nd dimension)....
      any                                # ...anywhere in the column.
    )
]
  • Related