dplyr中的筛选器列表变量

dplyr中的筛选器列表变量,r,dplyr,R,Dplyr,通常,我们如何通过dplyr中的列表变量进行过滤 例如,一个数据框,其中一个变量是不同类别对象的列表: aa <- tibble(ss = c(1,2), dd = list(NA, matrix(data = c(1,2,3,4), nrow = 2, ncol = 2))) > aa #

通常,我们如何通过dplyr中的列表变量进行过滤

例如,一个数据框,其中一个变量是不同类别对象的列表:

aa <- tibble(ss = c(1,2),
             dd = list(NA,
                       matrix(data = c(1,2,3,4),
                              nrow = 2,
                              ncol = 2)))

> aa
# A tibble: 2 x 2
#     ss dd           
#  <dbl> <list>       
#1  1.00 <lgl [1]>    
#2  2.00 <dbl [2 × 2]>
但这又回来了

# A tibble: 0 x 2
# ... with 2 variables: ss <dbl>, dd <list>
可以使用
purrr:map
对嵌套列表变量执行其他操作,但这也不起作用

> aa %>% filter(map(.x = dd,
+                   .f = is.logical))
# Error in filter_impl(.data, quo) : basic_string::resize

我在这里缺少什么?

我能做的最好的事情是使用
is.logical
purrr:map
取消列出它,
按它过滤
,然后取消选择该虚拟变量。行得通,但真是一团糟

aa %>%
  mutate(ff = map(.x = dd,
                       .f = is.logical),
         ff = unlist(ff)) %>%
  filter(ff == TRUE) %>%
  select(-ff)

# A tibble: 1 x 2
#      ss dd       
#   <dbl> <list>   
# 1  1.00 <lgl [1]>
aa%>%
变异(ff=map(.x=dd,
.f=是逻辑的),
ff=未列出(ff))%>%
过滤器(ff==真)%>%
选择(-ff)
#一个tibble:1x2
#ss dd
#       
# 1  1.00 

由于'dd'是一个
列表
列,我们可以使用
映射
循环通过'dd',但是'dd'的每个元素可以有多个元素,因此我们提出一个条件,如果
所有
元素都是
NA
,那么
过滤数据集的行

library(tidyverse)
aa %>%
   filter(map_lgl(dd, ~ .x %>%
                           is.na %>% 
                             all))
# A tibble: 1 x 2
#     ss dd       
#   <dbl> <list>   
#1     1 <lgl [1]>

在OP的代码中,
map
输出仍然是一个
列表
,我们用
map\u lgl

将其转换为一个逻辑向量。不过,它只适用于逻辑类,而我正在寻找一种过滤列表变量的通用方法。编辑问题使之成为现实clear@rubadubdub谢谢你的澄清。我更新了输出
aa %>%
  mutate(ff = map(.x = dd,
                       .f = is.logical),
         ff = unlist(ff)) %>%
  filter(ff == TRUE) %>%
  select(-ff)

# A tibble: 1 x 2
#      ss dd       
#   <dbl> <list>   
# 1  1.00 <lgl [1]>
library(tidyverse)
aa %>%
   filter(map_lgl(dd, ~ .x %>%
                           is.na %>% 
                             all))
# A tibble: 1 x 2
#     ss dd       
#   <dbl> <list>   
#1     1 <lgl [1]>
aa %>%
    filter(map_lgl(dd, is.logical))
# A tibble: 1 x 2
#     ss dd       
#  <dbl> <list>   
#1     1 <lgl [1]>