将名称分配给列表中的12个月度数据框

时间:2016-10-31 13:27:33

标签: r list dataframe

我在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“等等其他月份。然后最后将所有月度数据保存到一个数据框中。

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

谢谢

2 个答案:

答案 0 :(得分:2)

您也可以通过结合使用dcast - 包中的rbindlistdata.table函数来实现此目的。使用@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

答案 1 :(得分:1)

有点猜测你的输入是如何看起来的,但我做了以下示例和解决方案:

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:首先更改列名称,将月份名称粘贴到除代码colname之外的名称
  • 步骤2:使列表名称为NULL,以便cbind不会将名称粘贴到列
  • 第3步:cbind列表
  • 第4步:删除重复的代码列