【问题标题】:passing in vector of dataframes in function在函数中传入数据帧的向量
【发布时间】:2018-04-28 03:44:56
【问题描述】:

我正在尝试构建一个接受许多数据帧并将它们连接成单个数据帧的函数。我想了解最近对 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))

【问题讨论】:

    标签: r function dplyr purrr


    【解决方案1】:

    我们可以传递一个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
    

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

    c(df_1, df_2)
    

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 2021-09-01
      • 2023-03-09
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多