R for循环从数据帧参数中读取xlsx文件
R for loop to read in xlsx files from dataframe parameters
在 R 中,我正在设置一个我打算重复使用的各种模板,并且我正在定义我打算导入多少 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,但我也无法正常工作。
这应该可以满足您的需求,将数据帧存储在列表中。如果您宁愿拥有单独的对象,请使用 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
}
在 R 中,我正在设置一个我打算重复使用的各种模板,并且我正在定义我打算导入多少 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,但我也无法正常工作。
这应该可以满足您的需求,将数据帧存储在列表中。如果您宁愿拥有单独的对象,请使用 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
}