【问题标题】:how to grab specific columns from multiple data.frame and save it as a new data.frame in R?如何从多个data.frame中获取特定列并将其保存为R中的新data.frame?
【发布时间】:2021-07-16 02:49:33
【问题描述】:

我有以下示例 data.frame,其中包含多个变量(即 A、B、C)。

set.seed(123)

D1 <- data.frame(Date = seq(as.Date("2001-01-01"), to= as.Date("2001-01-10"), by="day"),
                 A = runif(10,1,5),
                 B = runif(10,3,6),
                 C = runif(10,2,5))
D2 <- data.frame(Date = seq(as.Date("2001-01-01"), to= as.Date("2001-01-10"), by="day"),
                 A = runif(10,1,5),
                 B = runif(10,3,6),
                 C = runif(10,2,5))
D3 <- data.frame(Date = seq(as.Date("2001-01-01"), to= as.Date("2001-01-10"), by="day"),
                 A = runif(10,1,5), 
                 B = runif(10,3,6), 
                 C = runif(10,2,5))

目标 我想从所有data.frame 中获取每个变量并将其保存为新的data.frame,名称设置为Variable,列名称设置为data.frame+variable,如下所示

A <- data.frame(Date, D1A,D2A,D3A)
B <- data.frame(Date,D1B,D2B,D3B)
C <- data.frame(Date,D1C,D2C,D3C)

如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: r dataframe data-binding tidyverse reshape


    【解决方案1】:

    我们在list(没有第一列“日期”)transpose 中获取数据集,然后使用map 循环遍历list,在每个数据集中绑定“日期”列(最好将其保留为list,但如果需要,请使用list2env 在全局环境中创建对象)

    library(dplyr)
    library(purrr)
    list(D1 = D1[-1], D2 = D2[-1], D3 = D3[-1]) %>%
         transpose %>%
         map(~ bind_cols(D1['Date'], .)) %>%
        list2env(.GlobalEnv)
    

    -检查创建的对象 A、B、C

    head(A, 2)
    #        Date       D1       D2       D3
    #1 2001-01-01 2.150310 4.852097 3.660461
    #2 2001-01-02 4.153221 4.609196 1.379363
    head(B, 2)
    #        Date       D1       D2       D3
    #1 2001-01-01 5.870500 3.428400 5.263425
    #2 2001-01-02 4.360002 4.243639 4.887663
    head(C, 2)
    #        Date       D1       D2       D3
    #1 2001-01-01 4.668618 2.137494 2.730858
    #2 2001-01-02 4.078410 3.326600 4.004167
    

    【讨论】:

    • 感谢@akrun,是否可以在转换为list 的同时获取Global Environment 工作区中的所有data.frame,而不是指定它们的名称?我有很多 data.frame 的名字很奇怪,所以很难一一输入他们的名字。
    • @Hydro 是的,如果您拥有所有具有D1D2 等模式的数据集名称,mget(ls(pattern = '^D\\d+$')) %&gt;% map(~ .x[-1]) %&gt;% transpose %&gt;..
    • 名称类似于"comb_1134887_avg_data.csv" "comb_1134570_avg_data.csv" "comb_1127495_avg_data.csv" "comb_1127543_avg_data.csv"。这些只是少数,还有很多类似的。我正在从目录中读取多个csv 文件,这就是为什么.csv 被添加到每个data.frame 最后。
    • @Hydro 这些是需要读取的对象名还是文件名?
    • @Hydro 在这种情况下,您可以将前面的行更改为mget(ls(pattern = "^comb_\\d+_avg_data\\.csv$")) %&gt;% map(~ .x[-1]) %&gt;% transpose
    【解决方案2】:

    这是一个基本的 R 选项

    lst <- mget(ls(pattern = "^D\\d+"))
    list2env(
      sapply(
        names(lst[[1]])[-1],
        function(x) {
          cbind(
            lst[[1]]["Date"],
            list2DF(lapply(lst, `[[`, x))
          )
        },
        USE.NAMES = TRUE,
        simplify = FALSE
      ),
      envir = .GlobalEnv
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2010-11-19
      • 2012-01-10
      • 2018-04-04
      • 2019-01-18
      相关资源
      最近更新 更多