Piping the removal of empty columns using dplyr
We can use a version of select_if
library(dplyr)
df %>%
select_if(function(x) !(all(is.na(x)) | all(x=="")))
# id Q2 Q3 Q4
#1 1 1 NA
#2 2 2
#3 3 4 3 2
#4 4 5 4 2
Or without using an anonymous function call
df %>% select_if(~!(all(is.na(.)) | all(. == "")))
You can also modify your apply
statement as
df[!apply(df, 2, function(x) all(is.na(x)) | all(x==""))]
Or using colSums
df[colSums(is.na(df) | df == "") != nrow(df)]
and inverse
df[colSums(!(is.na(df) | df == "")) > 0]
With dplyr
version 1.0, you can use the helper function where()
inside select
instead of needing to use select_if
.
library(tidyverse)
df <- data.frame(id = c(1, 2, 3, 4),
Q1 = c(1, "", 4, 5),
Q2 = c(NA, NA, NA, NA),
Q3 = c(NA, 2, 3, 4),
Q4 = c("", "", 2, 2),
Q5 = c("", "", "", ""))
df %>% select(where(~ !(all(is.na(.)) | all(. == ""))))
#> id Q1 Q3 Q4
#> 1 1 1 NA
#> 2 2 2
#> 3 3 4 3 2
#> 4 4 5 4 2