Объединение фреймов данных по горизонтали в R с именами - PullRequest
0 голосов
/ 16 июня 2020

У меня есть набор из 12 фреймов данных (DF1, DF2, ... DF12) с аналогичным форматом, например:

> DF1
# A tibble: 12 x 6
   month     mean  max   min   sd        n
   <chr>     <chr> <chr> <chr> <chr> <int>
 1 January   1.22    x     x     x      x
 2 February  2.23    x     x     x      x
 3 March     4.86    x     x     x      x
 4 April     7.82    x     x     x      x
 5 May        -      -     -     -      x
 6 June       -      -     -     -      x
 7 July       -      -     -     -      x
 8 August     -      -     -     -      x
 9 September  -      -     -     -      x
10 October    -      -     -     -      x
11 November   -      -     -     -      x
12 December   -      -     -     -      x

Фреймы данных всегда похожи (12X6) и имена столбцов тоже (месяц, среднее, макс., мин., среднеквадратичное, n). Как мне объединить 12 фреймов данных по горизонтали, чтобы получить что-то вроде этого (с названиями DF выше):

                   "name of the DF1"                           "name of the DF2"                 "name of the DF3"             ....
   month     mean.x max.x min.x sd.x n.x   mean.y       max.y       min.y sd.y n.y
1  January      -     -     -    -   -    -           -           -    -   -
2  February     -     -     -    -   -    -           -           -    -   -
3  March        -     -     -    -   -    -           -           -    -   -
4  April        -     -     -    -   -    -           -           -    -   -
5  May          -     -     -    -   -    -           -           -    -   -
6  June         -     -     -    -   -    -           -           -    -   -
7  July         -     -     -    -   -    -           -           -    -   -
8  August       -     -     -    -   -    -           -           -    -   -
9  September    -     -     -    -   -    -           -           -    -   -
10 October      -     -     -    -   -    -           -           -    -   -
11 November     -     -     -    -   -    -           -           -    -   -
12 December     -     -     -    -   -    -           -           -    -   -

У меня есть список, содержащий мои 12 фреймов данных:

var_names <- ls(envir = globalenv(), pattern = "^Final_analysis")
DF<- mget(var_names)

Ответы [ 3 ]

1 голос
/ 16 июня 2020

У вас не может быть многоиндексных фреймов данных в R. Таким образом, невозможно разместить имена DF над именами столбцов. Чтобы связать их вместе, попробуйте следующее:

var_names <- ls(pattern = "^Final_analysis")
do.call(cbind, mget(var_names))
1 голос
/ 16 июня 2020

Как упоминал @Eyayaw, невозможно, чтобы имена DF отображались над именами столбцов.

Однако мы можем обойти это, вставив имена DF в имена столбцов перед объединением всего с dplyr::bind_cols() как предложено @ grouah

Один из подходов для этого с использованием пакетов dplyr и purrr :

library(dplyr)
library(purrr)

# Create NAMED list of dataframes
df_list <- list("mtcars1" = mtcars, "mtcars2" = mtcars, "mtcars3" = mtcars)
# Add name of df to colnames
df_list <- imap(df_list, function(df, name) {
    colnames(df) <- paste(colnames(df), name, sep = "_")
    df
})
# Check result
map(df_list, colnames)
#> $mtcars1
#>  [1] "mpg_mtcars1"  "cyl_mtcars1"  "disp_mtcars1" "hp_mtcars1"   "drat_mtcars1"
#>  [6] "wt_mtcars1"   "qsec_mtcars1" "vs_mtcars1"   "am_mtcars1"   "gear_mtcars1"
#> [11] "carb_mtcars1"
#> 
#> $mtcars2
#>  [1] "mpg_mtcars2"  "cyl_mtcars2"  "disp_mtcars2" "hp_mtcars2"   "drat_mtcars2"
#>  [6] "wt_mtcars2"   "qsec_mtcars2" "vs_mtcars2"   "am_mtcars2"   "gear_mtcars2"
#> [11] "carb_mtcars2"
#> 
#> $mtcars3
#>  [1] "mpg_mtcars3"  "cyl_mtcars3"  "disp_mtcars3" "hp_mtcars3"   "drat_mtcars3"
#>  [6] "wt_mtcars3"   "qsec_mtcars3" "vs_mtcars3"   "am_mtcars3"   "gear_mtcars3"
#> [11] "carb_mtcars3"

# bind_cols() everything together
combined <- bind_cols(df_list)
colnames(combined)
#>  [1] "mpg_mtcars1"  "cyl_mtcars1"  "disp_mtcars1" "hp_mtcars1"   "drat_mtcars1"
#>  [6] "wt_mtcars1"   "qsec_mtcars1" "vs_mtcars1"   "am_mtcars1"   "gear_mtcars1"
#> [11] "carb_mtcars1" "mpg_mtcars2"  "cyl_mtcars2"  "disp_mtcars2" "hp_mtcars2"  
#> [16] "drat_mtcars2" "wt_mtcars2"   "qsec_mtcars2" "vs_mtcars2"   "am_mtcars2"  
#> [21] "gear_mtcars2" "carb_mtcars2" "mpg_mtcars3"  "cyl_mtcars3"  "disp_mtcars3"
#> [26] "hp_mtcars3"   "drat_mtcars3" "wt_mtcars3"   "qsec_mtcars3" "vs_mtcars3"  
#> [31] "am_mtcars3"   "gear_mtcars3" "carb_mtcars3"

Создано 16.06.2020 с помощью пакета REPEX (v0.3.0)

В качестве примера я просто использовал mtcars данные 3 раза в списке DF, но это должно работать для любого именованного списка кадров данных, которые имеют одинаковое количество строк (количество столбцов может быть другим).

1 голос
/ 16 июня 2020

dplyr::bind_cols(DF) может сделать свое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...