We could use select_if. NULL doesn't exist within a vector. So, the condition should be to check if the column is a list and if all the elements are NULL (is.null), negate (!) to select all the other columns
library(dplyr)
library(purrr)
null_list %>%
select_if(~ !(is.list(.) && all(map_lgl(., is.null))))
# A tibble: 3 x 1
# name
# <int>
#1 1
#2 2
#3 3
NOTE: This check if all the values in the list are NULL and then it removes those columns
If it is deeply nested,
example %>%
select(where(~ !(is.list(.) && is.null(unlist(.)))))
# A tibble: 3 x 3
# a b c
# <dbl> <dbl> <list>
#1 1 4 <NULL>
#2 2 5 <NULL>
#3 3 6 <list [3]>
Or to select only the list column with any non-NULL elements
example %>%
select(where(~ is.list(.) && !is.null(unlist(.))))
# A tibble: 3 x 1
# c
# <list>
#1 <NULL>
#2 <NULL>
#3 <list [3]>
data
example <- tibble(a = c(1, 2, 3), b = c(4, 5, 6),
c = list(NULL, NULL, list(1,2,3)),
d = list(NULL, NULL, list(x = NULL, y = NULL, z = NULL)))