【问题标题】:Assigning names to 12 monthly data frames in a list为列表中的 12 个每月数据框分配名称
【发布时间】:2017-02-18 01:49:40
【问题描述】:

我在 excel 中有一个数据,其中每个选项卡都有对应于一年中 12 个不同月份的数据。

我使用以下函数导入数据

read_excel_allsheets <- function(filename) {
sheets <- readxl::excel_sheets(filename)
x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
names(x) <- sheets
x
}

mysheet <- read_excel_allsheets("Delayed_11_12.xlsx")

mysheet 是一个列表,其中每个组件对应于每月数据集。 每月数据集具有以下变量或列,假设为“代码”、“x1”、“x2”、“x3”、“x4”。

我基本上想做的是将月份的名称粘贴到列中,除了第一个是上述每个月度数据的代码,例如,对于 4 月的月度数据,它是“代码”,“ x1_April”、“x2_April”、“x3_April”、“x4_April”等其他月份。然后最后将所有月度数据保存到一个数据框中。

我尝试过循环、嵌套循环等,但无济于事。你能帮忙解决一下吗?

谢谢

【问题讨论】:

  • 您没有包含工作表名称。名称中有月份指标吗?如果是,格式是什么?
  • 工作表名称如下 April_11 到 March_12 即从 4 月到 3 月

标签: r list dataframe


【解决方案1】:

您也可以通过结合使用 data.table 包中的 dcastrbindlist 函数来实现此目的。用@TobiasDekker的数据:

library(data.table)
dcast(rbindlist(mysheet, idcol = 'month'), 
      Code ~ month, 
      value.var = c('x_1','x_2','x_3'))

给出:

   Code x_1_April_12 x_1_May_12 x_2_April_12 x_2_May_12 x_3_April_12 x_3_May_12
1:    1            a          a            a          a            a          a
2:    2            b          b            b          b            b          b
3:    3            c          c            c          c            c          c
4:    4            d          d            d          d            d          d
5:    5            e          e            e          e            e          e

但是,在我看来,最好以长格式保存您的数据。如果你想这样做,你只需要rbindlist

rbindlist(mysheet, idcol = 'month')

给出:

       month Code x_1 x_2 x_3
 1: April_12    1   a   a   a
 2: April_12    2   b   b   b
 3: April_12    3   c   c   c
 4: April_12    4   d   d   d
 5: April_12    5   e   e   e
 6:   May_12    1   a   a   a
 7:   May_12    2   b   b   b
 8:   May_12    3   c   c   c
 9:   May_12    4   d   d   d
10:   May_12    5   e   e   e

【讨论】:

    【解决方案2】:

    有点猜测您的输入到底长什么样,但我做了以下示例和解决方案:

    mysheet <- list(April_12 = data.frame(Code = 1:5, x_1 = c("a", "b", "c","d", "e"), x_2 = c("a", "b", "c","d", "e"), x_3 = c("a", "b", "c","d", "e")),
                    May_12 =  data.frame(Code = 1:5, x_1 = c("a", "b", "c","d", "e"), x_2 = c("a", "b", "c","d", "e"), x_3 = c("a", "b", "c","d", "e")))
    
    > mysheet
    $April_12
      Code x_1 x_2 x_3
    1    1   a   a   a
    2    2   b   b   b
    3    3   c   c   c
    4    4   d   d   d
    5    5   e   e   e
    
    $May_12
      Code x_1 x_2 x_3
    1    1   a   a   a
    2    2   b   b   b
    3    3   c   c   c
    4    4   d   d   d
    5    5   e   e   e
    
    lapply(names(mysheet), function(x) colnames(mysheet[[x]])[2:ncol(mysheet[[x]])] <<- paste(colnames(mysheet[[x]])[2:ncol(mysheet[[x]])], x, sep = "_"))
    names(mysheet) <- NULL
    output  <- do.call(cbind, mysheet)
    output <- output[colnames(output)[!duplicated(colnames(output))]]
    
    > output
      Code x_1_April_12 x_2_April_12 x_3_April_12 x_1_May_12 x_2_May_12 x_3_May_12
    1    1            a            a            a          a          a          a
    2    2            b            b            b          b          b          b
    3    3            c            c            c          c          c          c
    4    4            d            d            d          d          d          d
    5    5            e            e            e          e          e          e
    
    • 步骤1:首先更改列名,将月份名称粘贴到除代码列名之外的列名
    • 第 2 步:将列表的名称设为 NULL,以便 cbind 不会将名称粘贴到列中
    • 第三步:绑定列表
    • 第四步:删除重复的代码列

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 2014-09-17
      • 2021-11-15
      相关资源
      最近更新 更多