переход в вектор данных в функцию - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь создать функцию, которая принимает множество фреймов данных и объединяет их в один фрейм данных. Я пытаюсь понять недавнее обновление до 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 голосов
/ 28 апреля 2018

Мы можем передать 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)
...