Цикл for, который подразделяет данные и записывает эти данные в отдельные шаблоны Excel. - PullRequest
0 голосов
/ 21 февраля 2019

По сути, у меня есть набор данных, который содержит 1000 строк данных примерно для 100 различных объектов, различающихся по их «идентификаторам объектов».Для каждого из этих средств я пытаюсь автоматизировать заполнение отдельной рабочей книги Excel из этих общих данных (поэтому создайте отдельную рабочую книгу для данных каждого объекта).Я могу получить код внутри цикла для запуска без проблем (часть, где я делаю книгу Excel из данных).Я просто не могу видеть, что я делаю неправильно в самом цикле.Любые отзывы будут приветствоваться!Для удобства я создал действительно упрощенный фрагмент данных и кода.

См. Фото с таблицей примеров данных Transfers_ALL:

> for (i in 1:length(uniq)){
  Transfers <- subset(data, Transfers_ALL$Facility_ID == uniq[i])

  #making empty matrix
  m <- (data.frame(matrix('', nrow = 60,ncol = 60), stringsAsFactors=FALSE)) 

  # places values in specific cells in the new empty matrix. 
  m[1:(1+length(Transfers$Facility_ID)-1),3]<- Transfers$Facility_ID
  m[1:(1+length(Transfers$Col1)-1),8] <- Transfers$Col1 # row#, column#

  ##' Puts the data from the new filled matrix into a pre-formatted excel workbook template. 
  wb <- XLConnect::loadWorkbook("test.xlsx", create=TRUE)
  setStyleAction(wb,XLC$"STYLE_ACTION.NONE")
  XLConnect::writeWorksheet(wb,m,"Sheet1",startRow=13,startCol=1,header=F)

  #Saves the new workbook for each Facility (or at least thats what I'm 
  #trying to do)       
  XLConnect::saveWorkbook(wb, name=paste("mywb",uniq[i],".xlsx",sep=""))
}

1 Ответ

0 голосов
/ 21 февраля 2019

Если я понимаю вопрос, следующий сделает то, что вы хотите.

Сначала создайте набор данных, поскольку вы еще не опубликовали его в форме для простого копирования и вставки.

set.seed(12345)    # Make the results reproducible
Facility_ID <- rep(sprintf("%s%04d", c("P", "P", "W"), c(123, 345, 678)), each = 3)
Col1 <- sample(c("metal", "concrete", "mixed", "c and d", "municipal"), 9, TRUE)
Col2 <- sample(10, 9, TRUE)
Col3 <- sample(c("yes", "no"), 9, TRUE)

Transfers_ALL <- data.frame(Facility_ID, Col1, Col2, Col3)

Теперь код.

write_sp_ALL <- function(DF, df_name){
  m <- as.data.frame(matrix('', nrow = 60, ncol = 60), stringsAsFactors = FALSE)

  nr <- nrow(DF)
  # places values in specific cells in the new empty matrix. 
  m[seq_len(nr), 3] <- as.character(DF[["Facility_ID"]])
  m[seq_len(nr), 8] <- as.character(DF[["Col1"]])

  file_name <- paste0("mywb", df_name, ".xlsx")  
  XLConnect::writeWorksheetToFile(file_name, m, sheet = "Sheet1", 
                            startRow = 13, startCol = 1, 
                            header = FALSE)

}

sp_ALL <- split(Transfers_ALL, Transfers_ALL[[1]])
nms <- names(sp_ALL)
lapply(seq_along(sp_ALL), function(i) 
  write_sp_ALL(sp_ALL[[i]], nms[i]))
...