在函数中传递数据帧的向量

时间:2018-04-28 03:44:57

标签: r function dplyr purrr

我正在尝试构建一个接受许多数据帧并将它们连接成一个数据帧的函数。我想了解最近对dplyr或purrr的更新?以及我将如何做到这一点。我尝试使用三重激励点!!!在我的功能中,但我仍然在努力做到这一点......

library(tidyverse)

df_1 = mtcars %>% slice(1:2)
df_2 = mtcars %>% slice(6:8)
df_3 = mtcars %>% slice(30:32)

get_bind_dfs = function(one_or_more_dfs ){

result = dplyr::bind_rows(one_or_more_dfs)
return(result)

}

get_bind_dfs(one_or_more_dfs = c(df1, df2, df3))

1 个答案:

答案 0 :(得分:3)

我们可以传递vector个字符串,然后使用mget来获取值

get_bind_dfs <- function(str1 ){

  dplyr::bind_rows(mget(str1, envir = .GlobalEnv))

  }

get_bind_dfs(paste0("df_", 1:3))
# A tibble: 8 x 11
#    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  21.0  6.00   160 110    3.90  2.62  16.5  0     1.00  4.00  4.00
#2  21.0  6.00   160 110    3.90  2.88  17.0  0     1.00  4.00  4.00
#3  18.1  6.00   225 105    2.76  3.46  20.2  1.00  0     3.00  1.00
#4  14.3  8.00   360 245    3.21  3.57  15.8  0     0     3.00  4.00
#5  24.4  4.00   147  62.0  3.69  3.19  20.0  1.00  0     4.00  2.00
#6  19.7  6.00   145 175    3.62  2.77  15.5  0     1.00  5.00  6.00
#7  15.0  8.00   301 335    3.54  3.57  14.6  0     1.00  5.00  8.00
#8  21.4  4.00   121 109    4.11  2.78  18.6  1.00  1.00  4.00  2.00

或者将data.frames作为list bind_rows可以接受

传递
get_bind_dfs <- function(one_or_more_dfs){

        dplyr::bind_rows(one_or_more_dfs)

 }

get_bind_dfs(list(df_1, df_2, df_3))
# A tibble: 8 x 11
#    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  21.0  6.00   160 110    3.90  2.62  16.5  0     1.00  4.00  4.00
#2  21.0  6.00   160 110    3.90  2.88  17.0  0     1.00  4.00  4.00
#3  18.1  6.00   225 105    2.76  3.46  20.2  1.00  0     3.00  1.00
#4  14.3  8.00   360 245    3.21  3.57  15.8  0     0     3.00  4.00
#5  24.4  4.00   147  62.0  3.69  3.19  20.0  1.00  0     4.00  2.00
#6  19.7  6.00   145 175    3.62  2.77  15.5  0     1.00  5.00  6.00
#7  15.0  8.00   301 335    3.54  3.57  14.6  0     1.00  5.00  8.00
#8  21.4  4.00   121 109    4.11  2.78  18.6  1.00  1.00  4.00  2.00

或者另一种选择是使用三个点作为参数,然后通过转换为quosures

进行评估
library(purrr)
get_bind_dfs <- function(...) {

   exprs <- rlang::enquos(...)
   map(exprs, rlang::eval_tidy) %>%
        bind_rows

  }

get_bind_dfs(df_1, df_2, df_3)
# A tibble: 8 x 11
#    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  21.0  6.00   160 110    3.90  2.62  16.5  0     1.00  4.00  4.00
#2  21.0  6.00   160 110    3.90  2.88  17.0  0     1.00  4.00  4.00
#3  18.1  6.00   225 105    2.76  3.46  20.2  1.00  0     3.00  1.00
#4  14.3  8.00   360 245    3.21  3.57  15.8  0     0     3.00  4.00
#5  24.4  4.00   147  62.0  3.69  3.19  20.0  1.00  0     4.00  2.00
#6  19.7  6.00   145 175    3.62  2.77  15.5  0     1.00  5.00  6.00
#7  15.0  8.00   301 335    3.54  3.57  14.6  0     1.00  5.00  8.00
#8  21.4  4.00   121 109    4.11  2.78  18.6  1.00  1.00  4.00  2.00

当我们连接多个cdata.frame列的多个list)时,它会丢失data.frame属性并将列附加到list

c(df_1, df_2)