Мне нужна помощь, чтобы улучшить этот код R для извлечения указанной c ячейки из каждого листа в xlxs - PullRequest
0 голосов
/ 31 января 2020

У меня есть эти коды ниже, которые извлекают первый столбец и ячейку третьей строки из каждого листа файла Excel, а затем объединяют их в один фрейм данных. У меня есть три файла, каждый из которых имеет 196,97 и 39 листов. Код работает, но он занимает слишком много времени.

Можете ли вы предложить лучший метод, который сокращает время выполнения Эта ссылка представляет собой пример исходного файла Excel. Я изменил его, чтобы задать этот вопрос.

Мой исходный код:


Team3Q<-getSheetNames("reportTeam_3_FultonCountySchools.xlsx")

#using For Loop to extract particular cells from each of the sheets in the Excel spreadsheet.
#I need to get the content of the first column and third row of each sheet.
for (j in 1:length(Team3Q)){ 
  tmp<-read.xlsx("reportTeam_3_FultonCountySchools.xlsx", 
                 sheet = j,
                 startRow = 3,
                 colNames = FALSE,
                 rowNames = FALSE,
                 detectDates = FALSE,
                 skipEmptyRows = TRUE,
                 skipEmptyCols = TRUE,
                 rows = c(3,4),
                 cols = c(1:2),
                 check.names = FALSE,
                 namedRegion = NULL,
                 na.strings = "NA",
                 fillMergedCells = FALSE
  )   
  if (j==1) Team3Questions<-tmp else Team3Questions<-rbind(Team3Questions,tmp)   #happend to previous
}
Team3<- cbind(Team3QNumber,Team3Questions)

Конечным результатом этого процесса является фрейм данных с двумя столбцами, где каждому номеру листа и «номеру вопроса» соответствуют на «вопросы», извлеченные из строки 1 столбца 3 каждого листа.

Выглядит так:

Question-Number  Question
3.2.1           Question 1
3.2.2           Question 2
3.3.1           Question 3
3.3.2           Question 4
3.3.3           Question 5
3.4.1           Question 6
3.4.2           Question 7
3.4.3           Question 8
3.4.4           Question 9
3.4.5           Question 10

1 Ответ

2 голосов
/ 31 января 2020

вместо этого вы можете использовать lapply (). Это даст вам список с одним элементом на листе. Затем связать элементы списка вместе с do.call ():

Team3list <- lapply(Team3Q, function(x) read.xlsx("reportTeam_3_FultonCountySchools.xlsx",
                                     sheet=x, #function-x is here
                                     startRow = 3,
                                     colNames = FALSE,
                                     rowNames = FALSE,
                                     detectDates = FALSE,
                                     skipEmptyRows = TRUE,
                                     skipEmptyCols = TRUE,
                                     rows = c(3,4),
                                     cols = c(1:2),
                                     check.names = FALSE,
                                     namedRegion = NULL,
                                     na.strings = "NA",
                                     fillMergedCells = FALSE)
       )


Team3 <- do.call(rbind, Team3list)

edit: я только что понял, что если вы используете sapply вместо lapply, вы получите эти 3.2.1, 3.2.2, .. значения вместо 1,2,3,4, ... Вам нужно только затем gsub () их, чтобы в конце избавиться от этого ".X1".

Team3list1 <- sapply(...)
Team3 <- do.call(rbind, Team3list1)
rownames(Team3) <- rownames(gsub(".X1$","", Team3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...