【问题标题】:Combining data frames horizontally in R with names将R中的数据框与名称水平组合
【发布时间】:2020-10-05 20:56:47
【问题描述】:

我有一组 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)

【问题讨论】:

  • 你好 :) 我想知道你为什么要在 R 中实现这个漂亮的人类可读的显示。为了进行进一步的分析,我认为不推荐这样做(参见r4ds.had.co.nz/tidy-data.html)。如果你想要一个“好看的文档”,我建议你看看 Rmarkdown 和 kable() 之类的功能。

标签: r list merge


【解决方案1】:

dplyr::bind_cols(DF) 可以解决问题。

【讨论】:

  • 没错,它有效!在这个分析中,12 DF 到处都有值。现在,我想获得一些非常自动的东西,并且在另一组 12 个 DF 的另一个分析中,最后一个 DF 是空的(此表中没有可用数据,在此分析中是正常的)。在这种情况下,R 会返回“错误:参数 12 的长度必须为 12,而不是 0”。是否可以添加诸如“像其他 DF 一样,即使您是空的”之类的内容?
  • 它返回错误,因为最后一个df是空的。也许您可以人为地创建一个相同大小(12x5)的df,并用NA填充它。
【解决方案2】:

正如@Eyayaw 所提到的,DF 名称不可能出现在列名称上方。

但是,我们可以通过将 DF 名称粘贴到列名称中来解决此问题,然后按照 @grouah 的建议将所有内容与 dplyr::bind_cols() 结合起来

使用dplyrpurrr 包的一种方法:

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"

reprex package (v0.3.0) 于 2020 年 6 月 16 日创建

例如,我只是在 DF 列表中使用了 3 次 mtcars 数据,但这应该适用于具有 相同行数的任何 命名 数据框列表(列数可以不同)。

【讨论】:

    【解决方案3】:

    您不能在 R 中拥有多索引数据框。因此无法将 DF 名称放在 colnames 之上。无论如何要将它们绑定在一起,请尝试以下操作:

    var_names <- ls(pattern = "^Final_analysis")
    do.call(cbind, mget(var_names))
    

    【讨论】:

    • 但是我只是获得了一个列表` > var_names DF a a [,1] DF1 列表,6 DF2 列表,6 DF3 列表,6 DF4 列表,6 DF5 列表,6 DF6 列表,6 ... `
    • 在这种情况下您不需要使用list() 。只需这样做:do.call(cbind, mget(var_names))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2023-03-24
    • 2013-02-14
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多