dplyr中的过滤器列表变量

Uma*_*mao 2 r dplyr

一般来说,我们如何在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]>
Run Code Online (Sandbox Code Playgroud)

例如,如果我要过滤逻辑(尽管可以是任何东西),如果它不是列表,它将像以下这样简单:

aa %>% filter(is.logical(dd))
Run Code Online (Sandbox Code Playgroud)

但这又回来了

# A tibble: 0 x 2
# ... with 2 variables: ss <dbl>, dd <list>
Run Code Online (Sandbox Code Playgroud)

因为不是逻辑上的第一个元素,所以它是第一个元素的第一个元素:

> is.logical(aa$dd[1])
# [1] FALSE
> is.logical(aa$dd[[1]])
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

可以purrr:map对嵌套列表变量执行其他操作,但这也不起作用。

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

我在这里想念什么?

akr*_*run 5

由于“ dd”是一list列,我们可以使用来遍历“ dd” map,但是“ dd”的每个元素可以有多个元素,因此我们要确定一个条件,如果all元素是NA,则filter数据集的行

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

如果这是filter基于class

aa %>%
    filter(map_lgl(dd, is.logical))
# A tibble: 1 x 2
#     ss dd       
#  <dbl> <list>   
#1     1 <lgl [1]>
Run Code Online (Sandbox Code Playgroud)

在OP的代码中,map输出仍然是a list,我们将其转换为逻辑向量map_lgl