我正在尝试从 Excel 电子表格导入数据,仅选择一组工作表(不是所有工作表),然后执行几个数据转换步骤(旋转更长的时间并更改数据类型)。
我用 4 行代码得到了这个,理论上我可以为每个工作表复制并粘贴这个 block (总共 8 个),但我想看看是否可以使用一个函数循环遍历所有这些。
步骤如下:
1)读取特定工作表并将其保存为数据框
2) 旋转更长的列 2:13
3) 将新列值从 Excel 日期类型(数字)更改为实际日期
4)将日期更改为yearmon格式
这是我在一张纸上执行此操作的代码:
kerrie <- read_excel("report.xlsx", sheet = "KERRIE_DATA") # load Kerrie data sheet
kerrie <- pivot_longer(kerrie, 2:13, names_to = "month") # put months into rows
kerrie$month <- excel_numeric_to_date(as.numeric(kerrie$month), date_system = "modern") # change date data type
kerrie$month <- as.yearmon(kerrie$month) # turn into yearmon
这是一个包含所有工作表名称的向量
sheetNames <- c("KERRIE_DATA", "GAIL_DATA", "DANIELLE_DATA", "ISABELLE_DATA","ESTELLE_DATA", "CLARE_DATA", "JEN_DATA", "CHRIS_DATA")
这是我为第 1 步找到的解决方案:它循环遍历 Excel 工作簿并导入我所需的工作表,将它们另存为数据框
library(openxlsx)
a <- loadWorkbook("report.xlsx")
for(i in 1:length(sheetNames))
{
assign(sheetNames[i],readWorkbook(a,sheet = i))
}
您能帮我将步骤 2:4 放入函数/循环中吗?
最佳答案
您可以编写一个包含所有步骤的函数:
apply_fun <- function(sheet_name) {
kerrie <- readxl::read_excel("report.xlsx", sheet = sheet_name)
kerrie <- tidyr::pivot_longer(kerrie, 2:13, names_to = "month")
kerrie$month <- janitor::excel_numeric_to_date(as.numeric(kerrie$month),
date_system = "modern")
kerrie$month <- zoo::as.yearmon(kerrie$month)
return(kerrie)
}
并将其应用于所有工作表
complete_data <- lapply(sheetNames, apply_fun)
这将返回 complete_data
中的数据帧列表。
关于r - 如何构建一个循环数据帧并转换其中数据的函数 (R),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61007807/