2016-10-27 3 views
2

Моя функция одного аргумента подавался dataframeПрименить список к функции, которая выводит dataframe

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

При кормлении одним аргументом в этой функции, он выводит, как и ожидалось, в dataframe:

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') 

и, как результат, чтобы получить один dataframe:

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)?

ответ

3

Чтобы остаться в 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)) 

Или, чтобы получить немного более извращенными о смешивании базы и tidyverse:

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

И для базы ¨R традиционалистов:

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

работает отлично! Спасибо! Мне не хватало%>% bind_rows – Irakli

+1

Альтернативы: 'c (" mpg> 15 "," am == 1 ")%>% map_df (myfun)' или 'invoke_map_df (myfun, c (" mpg> 15 "," am == 1 "))' – alistaire

+0

Ничего себе так коротко и элегантно, только одна труба @alistaire: c ("mpg> 15", "am == 1")%>% map_df (myfun) – Irakli