【问题标题】:Apply a list to a function that outputs a dataframe将列表应用于输出数据帧的函数
【发布时间】:2017-03-09 13:24:27
【问题描述】:

我的单参数函数输出一个数据帧

library(tidyverse) 
myfun <-function(x) {mtcars %>%
                         filter_(x) %>%
                         group_by(cyl) %>%
                         summarise(mean(disp), mean(drat)) %>%
                         mutate(group=x)}

当向这个函数输入一个单一参数时,它会按预期输出一个数据帧:

   myfun('mpg>15')

   cyl      mean(disp)   mean(drat)     group
    4       105           4.07          mpg>15
    6       183           3.59          mpg>15
    8       105           3.20          mpg>15

如何将这样的函数应用于参数列表,以便输出是一个数据帧,该数据帧结合了列表中的所有结果。例如,我想将 myfun 应用于列表

c('mpg>15', 'drat>4.2')

并因此获得单个数据帧:

cyl      mean(disp)   mean(drat)     group
 4       105           4.07          mpg>15
 6       183           3.59          mpg>15
 8       105           3.20          mpg>15
 4       89            4.53          drat>4.2
 8       351           4.22          drat>4.2

如何做到这一点(最好在 tidyverse 中)?

【问题讨论】:

    标签: r list function dplyr tidyverse


    【解决方案1】:

    留在tidyverse,可能是这样的:

    c("mpg>15", "am==1") %>% map(myfun) %>% bind_rows
    

    但是,正如@alistaire 在评论中指出的那样,您可以使用map_df 缩短它,它会返回一个数据框:

    c("mpg>15", "am==1") %>% map_df(myfun)
    

    混合选项,三种等效方式,使用lapply:

    lapply(c("mpg>15", "am==1"), myfun) %>% bind_rows 
    c("mpg>15", "am==1") %>% lapply(myfun) %>% bind_rows
    bind_rows(lapply(c("mpg>15", "am==1"), myfun))
    

    或者,对于混合 base 和 tidyverse 有点反常:

    c("mpg>15", "am==1") %>% lapply(myfun) %>% do.call(rbind, .)
    

    对于基础 R 的传统主义者:

    do.call(rbind, lapply(c("mpg>15", "am==1"), myfun))
    

    【讨论】:

    • 完美运行!谢谢!我错过了 %>% bind_rows
    • 替代方案:c("mpg&gt;15", "am==1") %&gt;% map_df(myfun) 或 invoke_map_df(myfun, c("mpg&gt;15", "am==1"))
    • 哇,这么短又优雅,只有一根管子 @alistaire: c("mpg>15", "am==1") %>% map_df(myfun)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多