我在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“等等其他月份。然后最后将所有月度数据保存到一个数据框中。
我试过循环,嵌套循环等但无济于事。你能帮忙解决一下吗?
谢谢
答案 0 :(得分:2)
您也可以通过结合使用dcast
- 包中的rbindlist
和data.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