首页 > 解决方案 > R for循环从数据框参数读取xlsx文件

问题描述

在 RI 中,我正在设置一个我计划重复使用的模板,并且我正在定义我打算导入多少 xlsx 文件、它们的名称和相关的工作表。这是为了减少下次工作。我希望使用此信息也将每个信息加载到其各自的数据框中。但我无法让它工作。

##Set up the workbooks and worksheets you'll be working with
numFiles = 2 #num
files <- data.frame(
  fileNum = c (1:numFiles),
  fileName = c("one.xlsx","two.xlsx"), #list their names
  sheetName = c("sheet1","sheet1") #list the worksheet for respective files
)

##Read workbooks
for (n in numFiles)
{
  nameTemp = paste("Data", files[[n,"fileName"]], sep = "") 
  #alternative I tried this but it didn't work:
  #assign(paste(("Data", files[[n,"fileName"]], sep = "")) = read.xlsx(files[[n,"fileName"]], sheet = files[[n,"sheetName"]])
  nameTemp = read.xlsx(files[[n,"fileName"]], sheet = files[[n,"sheetName"]])
}

在 for 循环读取期间出现问题。

我还尝试在 for 循环中使用 assign 而不是我的 nameTemp,但我也无法使其正常工作。

标签: rfor-loopxlsx

解决方案


这应该做你想做的,将数据帧存储在一个列表中。如果您希望有单独的对象,请查看多个分配zeallot(编辑:添加示例)

numFiles = 2 

files <- data.frame(
  fileNum = c (1:numFiles),
  fileName = c("one.xlsx", "two.xlsx"), # try list.files(pattern = "*.xlsx") to automate this
  sheetName = c("Sheet1","Sheet2"),
  stringsAsFactors = F
)

data = list()

for (n in 1:numFiles) {
  data[[n]] = readxl::read_xlsx(path = files$fileName[n], sheet = files$sheetName[n])
}

library(zeallot)
c(myname1,myname2) %<-% data

编辑:我想到了一种更简洁的方式,它应该更接近您想要实现的目标:

numFiles = 2

files <- data.frame(
  fileNum = c (1:numFiles),
  fileName = c("one.xlsx", "two.xlsx"), # try list.files(pattern = "*.xlsx") to automate this
  sheetName = c("Sheet1","Sheet2"),
  stringsAsFactors = F
)

for (n in 1:numFiles) {
    assign(paste0("Data",substr(files$fileName[n],1,nchar(files$fileName[n])-5)),    # object name
           readxl::read_xlsx(path = files$fileName[n], sheet = files$sheetName[n]))  # data
}

推荐阅读