Reputation: 2584
I have gone through most of the comments and I could not find any one which could help me without me knowing which rows are NA for all columns.
Let say, I have a data looks like this
df<- structure(list(COl1 = c("A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "K", "L", "M"), COl2 = c(0L, NA, NA, NA, NA, 3L, 34L,
4L, 56L, 6L, NA, NA, NA), COl3 = c(NA, 2L, NA, NA, NA, 1L, 924L,
NA, 8373L, NA, NA, NA, NA), COl4 = c(NA, 2L, NA, NA, NA, 2L,
NA, NA, 9292L, NA, NA, NA, NA), COl5 = c(NA, 2L, NA, 1L, NA,
3L, NA, NA, 9282L, NA, NA, NA, NA), COl6 = c(NA, 2L, NA, 2L,
NA, 2L, NA, NA, 1L, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA,
-13L))
which it looks like this
COl1 COl2 COl3 COl4 COl5 COl6
A 0 NA NA NA NA
B NA 2 2 2 2
C NA NA NA NA NA
D NA NA NA 1 2
E NA NA NA NA NA
F 3 1 2 3 2
G 34 924 NA NA NA
H 4 NA NA NA NA
I 56 8373 9292 9282 1
J 6 NA NA NA NA
K NA NA NA NA NA
L NA NA NA NA NA
M NA NA NA NA NA
I want to remove those rows that have only NA but keep those that still have at least 1 value.
so the output will look like this
COl1 COl2 COl3 COl4 COl5 COl6
A 0 NA NA NA NA
B NA 2 2 2 2
D NA NA NA 1 2
F 3 1 2 3 2
G 34 924 NA NA NA
H 4 NA NA NA NA
I 56 8373 9292 9282 1
J 6 NA NA NA NA
Upvotes: 1
Views: 43
Reputation: 389055
Using dplyr
new across
function.
library(dplyr)
df %>% filter(Reduce(`|`, across(COl2:COl6, ~!is.na(.))))
# COl1 COl2 COl3 COl4 COl5 COl6
#1 A 0 NA NA NA NA
#2 B NA 2 2 2 2
#3 D NA NA NA 1 2
#4 F 3 1 2 3 2
#5 G 34 924 NA NA NA
#6 H 4 NA NA NA NA
#7 I 56 8373 9292 9282 1
#8 J 6 NA NA NA NA
Upvotes: 0
Reputation: 887231
An option is rowSums
from base R
on a logical matrix
df[rowSums(!is.na(df[-1]))> 0,]
-output
# COl1 COl2 COl3 COl4 COl5 COl6
#1 A 0 NA NA NA NA
#2 B NA 2 2 2 2
#4 D NA NA NA 1 2
#6 F 3 1 2 3 2
#7 G 34 924 NA NA NA
#8 H 4 NA NA NA NA
#9 I 56 8373 9292 9282 1
#10 J 6 NA NA NA NA
Or use Reduce
subset(df, Reduce(`|`, lapply(df[-1], Negate(is.na))))
Or use filter_at
from dplyr
library(dplyr)
df %>%
filter_at(vars(-COl1), any_vars(!is.na(.)))
Upvotes: 1