我有一个包含空列表列的数据框,类似于:
null_list <- list(NULL, NULL, NULL) %>% enframe()
null_list
# name value
# <int> <list>
#1 1 <NULL>
#2 2 <NULL>
#3 3 <NULL>
我想删除所有仅包含 NULL 值的列,例如上面的“值”列,因为当我尝试 unnest_wider 这些列(作为循环的一部分)时,我收到错误“替换长度为零。 ”
最佳答案
我们可以使用select_if
。 向量
中不存在NULL
。因此,条件应该是检查该列是否为列表
,以及所有
元素是否为NULL
(is.null
),否定 (!
) 以选择
所有其他列
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
注意:这会检查列表
中的所有值是否为NULL
,然后删除这些列
如果嵌套很深,
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]>
或者仅选择包含非 NULL 元素的 list
列
example %>%
select(where(~ is.list(.) && !is.null(unlist(.))))
# A tibble: 3 x 1
# c
# <list>
#1 <NULL>
#2 <NULL>
#3 <list [3]>
数据
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)))
关于删除空列表列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63307574/