【问题标题】:How can I filter dataframes from a list using Purrr?如何使用 Purrr 从列表中过滤数据框?
【发布时间】:2020-12-22 18:40:43
【问题描述】:

我有一个数据框列表。有两种类型的数据框,一种列出姓名和年龄,另一种列出测试和成绩(如下面的“组合列表”所示)。

df1 <- data.frame(name = c("Alice", "Bob"),
                 age = c(23, 41))
df2 <- data.frame(test = c("Geography", "Science"),
                  grade = c("A", "B"))
df3 <- data.frame(name = c("Claire", "David"),
                  age= c(50, 32))
df4 <- data.frame(test = c("Geography", "Science"),
                  grade = c("B", "B"))

combined_list <- c(df1,df2,df3,d4)

我想将列表子集化为仅包含姓名和年龄的数据框,因此它看起来像这样:

   name age
1 Alice  23
2   Bob  41
3 Claire 50
4 David  32

我找到了 Purrr 包的 Keep 功能,它应该可以根据条件过滤列表,但我还没有找到让它工作的方法。这是我迄今为止尝试过的:

library(purrr)
purrr:keep(function(x) filter(!name=NULL))

我怎样才能做到这一点?还有其他解决方案吗?

【问题讨论】:

    标签: r tidyverse purrr


    【解决方案1】:

    我们为Filter 的元素创建逻辑条件list,它返回单个TRUE。这可以通过在使用%in% 创建逻辑向量后使用all 包装来完成,即仅将那些同时具有“名称”和“年龄”作为列名的元素设置子集。然后,我们使用bind_rowslist 元素绑定到单个data.frame

    library(dplyr)
    library(purrr)
    keep(combined_list, ~  all(c("name", 'age') %in% names(.x))) %>% 
         bind_rows
    

    -输出

    #     name age
    #1  Alice  23
    #2    Bob  41
    #3 Claire  50
    #4  David  32
    

    或者另一种选择是将所有数据集绑定在一起,然后 select 仅相关列并删除 NA

    bind_rows(combined_list) %>% 
        select(name, age) %>% 
        na.omit
    

    base R 中,我们可以在do.call 中使用Filterrbind

    do.call(rbind, Filter(function(x) 
          all(c("name", "age") %in% names(x)), combined_list))
    #    name age
    #1  Alice  23
    #2    Bob  41
    #3 Claire  50
    #4  David  32
    

    数据

    combined_list <- list(df1,df2,df3,df4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多