Home > Blockchain >  Remove columns that have one zero value
Remove columns that have one zero value

Time:05-03

I have data frame like this

       class     col2    col3   col4   col5  col6
A      AA         0        5      4      2    15
B      AA         4       10     14     12    25
C      AA         19       2      8      5     3  
D      SS         17       5      5     32    12
E      AA         14       2      12    14    55
F      II         12      17       1     9     0 
G      SS         10      37       8     2    17
H      II         17       7       5     7   14

I want to remove all columns that have zero values

       class         col3    col4   col5     
A      AA              5       4      2   
B      AA               10     14     12    
C      AA                2      8      5      
D      SS                5      5     32    
E      AA                2     12    14    
F      II               17       1     9      
G      SS               37       8     2    
H      II                7       5     7    

So the result I want is just want those columns which do not contain any zeros

Thank you

CodePudding user response:

Based on your description I assume you want to remove rows with zero values, not columns. Here's how you can do it with dplyr:

library(dplyr)

filter(df, across(everything(), ~.!=0))

#> # A tibble: 4 x 6
#>   class  col2  col3  col4  col5  col6
#>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 AA        4    10    14    12    25
#> 2 AA       19     2     8     5     3
#> 3 AA       14     2    12    14    55
#> 4 SS       10    37     8     2    17

CodePudding user response:

A possible solution:

df[apply(df == 0, 2, sum) == 0]

#>   class col3 col4 col5
#> A    AA    5    4    2
#> B    AA   10   14   12
#> C    AA    2    8    5
#> D    SS    5    5   32
#> E    AA    2   12   14
#> F    II   17    1    9
#> G    SS   37    8    2
#> H    II    7    5    7

CodePudding user response:

One base R option could be:

df_so[,!sapply(df_so, function(x) any(x == 0))]

#  class col3 col4 col5
#A    AA    5    4    2
#B    AA   10   14   12
#C    AA    2    8    5
#D    SS    5    5   32
#E    AA    2   12   14
#F    II   17    1    9
#G    SS   37    8    2
#H    II    7    5    7

Not my answer, but @user2974951 provided a very fast and straightforward answer as a comment in the Original Post:

df[,colSums(df==0)==0]

CodePudding user response:

With the new dataset: base R: In base R we can use Filter and negate any:

Filter(function(x) !any(x %in% 0), df) 
  class col3 col4 col5
A    AA    5    4    2
B    AA   10   14   12
C    AA    2    8    5
D    SS    5    5   32
E    AA    2   12   14
F    II   17    1    9
G    SS   37    8    2
H    II    7    5    7
  • Related