删除空列表列

标签 r purrr

我有一个包含空列表列的数据框,类似于:

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/

相关文章:

r - 在 R ggplot 中如何更改多个条形图的标签

r - 如何将函数应用于 dplyr 链中的整个表

r - 每行删除重复项的整洁方法

r - 如果 try 内的表达式失败,Rmarkdown 不会打印错误消息

R 拆分列表需要很长时间

r - 从 dplyr 管道中的当前观察中减去特定数字

r - 使用 dplyr 根据列名称更改数据框中的值?

r - purrr pmap 函数参数

r - 如何在多行公式中使用 purrr 波浪号函数

r - 按组在多个时间间隔列之间重叠