R для l oop для чтения в файлах xlsx из параметров фрейма данных - PullRequest
0 голосов
/ 10 июля 2020

Внутри 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 l oop.

Я также пробовал использовать assign вместо моего nameTemp внутри for l oop, но я тоже не смог заставить это работать.

1 Ответ

0 голосов
/ 10 июля 2020

Это должно делать то, что вы хотите, сохраняя фреймы данных в списке. Если вы предпочитаете отдельные объекты, изучите множественное назначение с помощью 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...