Dongchul Park
Dongchul Park

Reputation: 175

How to remove specific rows in R?

A data set I'm using is the following:

    C1  C2  C3  R1
R1  NA  NA  NA   5 
R2  NA  NA  0.4  7
R3  0.1     NA   6
R4  NA  NA  NA   2 

From the data frame, I want to remove rows that contain numbers which is larger than zero from C1 to C3.

The final outcome must be:

    C1  C2  C3  R1
R1  NA  NA  NA   5
R4  NA  NA  NA   2 

I tried with:

df<- df %>% filter_at(vars('C1' : 'C2`), all_vars(. > 0))

but I got en error with this. How Can I fix it?

Imported from Excel: enter image description here

Wrote in R: enter image description here

Upvotes: 0

Views: 247

Answers (2)

Ronak Shah
Ronak Shah

Reputation: 388862

You can use rowSums in base R :

cols <- paste0('C', 1:3)  
df[rowSums(df[cols] > 0, na.rm = TRUE) == 0, ]

Or using filter_at :

library(dplyr)
df %>% filter_at(vars(C1:C3), all_vars(. <= 0 | is.na(.)))

#   C1 C2 C3 R1
#R1 NA NA NA  5
#R4 NA NA NA  2

and filter_at has been deprecated so you can write this with across as :

df %>% filter(across(C1:C3, ~. <= 0 | is.na(.)))

data

df <- structure(list(C1 = c(NA, NA, 0.1, NA), C2 = c(NA, NA, NA, NA
), C3 = c(NA, 0.4, NA, NA), R1 = c(5L, 7L, 6L, 2L)), 
class = "data.frame", row.names = c("R1", "R2", "R3", "R4"))

Upvotes: 3

sunshinegirl
sunshinegirl

Reputation: 81

A more manual approach is as follows:

df <- as.data.table(df)

if(length(which(df$C1 > 0)) > 0){df <- df[-(which(df$C1 > 0)),]}
if(length(which(df$C2 > 0)) > 0){df <- df[-(which(df$C2 > 0)),]}
if(length(which(df$C3 > 0)) > 0){df <- df[-(which(df$C3 > 0)),]}

Upvotes: 0

Related Questions