将列表应用于输出数据帧的函数
Apply a list to a function that outputs a dataframe
我的单参数函数输出一个数据帧
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 中)?
留在tidyverse
,可能是这样的:
c("mpg>15", "am==1") %>% map(myfun) %>% bind_rows
但是,正如@alistaire 在评论中指出的那样,您可以使用 map_df
来缩短它,其中 returns 一个数据框:
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))
我的单参数函数输出一个数据帧
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 中)?
留在tidyverse
,可能是这样的:
c("mpg>15", "am==1") %>% map(myfun) %>% bind_rows
但是,正如@alistaire 在评论中指出的那样,您可以使用 map_df
来缩短它,其中 returns 一个数据框:
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))