【问题标题】:filter list variable in dplyr在 dplyr 中过滤列表变量
【发布时间】:2018-05-29 04:52:06
【问题描述】:

一般我们如何通过 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]>

例如,如果我想过滤逻辑(虽然可以是任何东西),如果它不是一个列表,它会很简单:

aa %>% filter(is.logical(dd))

但这会返回

# A tibble: 0 x 2
# ... with 2 variables: ss <dbl>, dd <list>

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

> is.logical(aa$dd[1])
# [1] FALSE
> is.logical(aa$dd[[1]])
# [1] TRUE

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

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

我在这里错过了什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    由于'dd'是list列,我们可以使用map遍历'dd',但是'dd'的每个元素可以有多个元素,所以我们做一个条件,如果@ 987654323@元素是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]>
    

    如果这是关于filtering 基于class

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

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

    【讨论】:

    • 很好的答案。虽然只适用于逻辑,而我真的在寻找一种过滤列表变量的通用方法。编辑问题以明确这一点
    • @rubadubdub 感谢您的澄清。我更新了输出
    【解决方案2】:

    我能做的最好的事情是使用is.logicalpurrr:mapunlist 它、filter 创建一个虚拟变量,然后取消select 虚拟变量。有效,但多么混乱。

    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]>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 2019-04-04
      • 1970-01-01
      • 2022-01-02
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多