Как прочитать несколько файлов данных Excel в al oop и обработать данные из каждого файла? - PullRequest
1 голос
/ 28 марта 2020

У меня есть 11 файлов данных Excel, которые я хотел бы открыть, обработать и, наконец, построить в соответствии с теоретическими данными. Я могу сделать это для файла Excel отдельно, но я хотел бы сделать код короче, выполнив это в al oop. Мои имена файлов данных от S00.xlsx до S10.xlsx (11 файлов). Я использую следующее для чтения каждого файла:

library('readxl')
SS00 <- read_excel("S00.xlsx", sheet = "Bridge Object Girder Forces", skip = 3, col_names = FALSE)

Мне нужно обработать каждый файл данных, как показано ниже:

S00_shear <- data.frame(S00[,5],SS00[,8],S00[,12])
names(S00_shear) <- c("Girder", "Load", "Shear")

# Split data for single lane loaded and multi lane loaded
S00_Shear_multi.lane <- S00_shear[which(S00_shear$Load == "LL-1"),]
S00_Shear_single.lane <- S00_shear[which(S00_shear$Load == "LL-Single"),]

# Split data for the exterior girders and interior girders
S00_Shear.ext_multi.lane <- subset(S00_Shear_multi.lane, Girder %in% c("Left Exterior Girder",
                                                                     "Right Exterior Girder"))
S00_Shear.int_multi.lane <- subset(S00_Shear_multi.lane, Girder %in% c("Interior Girder 1",
                                                                     "Interior Girder 2",
                                                                     "Interior Girder 3"))

S00_Shear.ext_single.lane <- subset(S00_Shear_single.lane, Girder %in% c("Left Exterior Girder",
                                                                       "Right Exterior Girder"))
S00_Shear.int_single.lane <- subset(S00_Shear_single.lane, Girder %in% c("Interior Girder 1",
                                                                       "Interior Girder 2",
                                                                       "Interior Girder 3"))

# Find the maximum shear values
S00_Max.Shear.ext_multi.lane <- max(S00_Shear.ext_multi.lane$Shear)
S00_Max.Shear.int_multi.lane <- max(S00_Shear.int_multi.lane$Shear)
S00_Max.Shear.ext_single.lane <- max(S00_Shear.ext_single.lane$Shear)
S00_Max.Shear.int_single.lane <- max(S00_Shear.int_single.lane$Shear)

Как только у меня есть максимальные значения для всех 11 файлов данных, тогда я нужен финальный стол

# Read theoretical values and find ratios
Beamline <- read.csv(file = "Beamline.csv", header = TRUE, sep = ",", row.names =1)
Shear <- data.frame(EXT.Single = c(S00_Max.Shear.ext_single.lane,S01_Max.Shear.ext_single.lane,
                               S02_Max.Shear.ext_single.lane,S03_Max.Shear.ext_single.lane,
                               S04_Max.Shear.ext_single.lane,S05_Max.Shear.ext_single.lane,
                               S06_Max.Shear.ext_single.lane,S07_Max.Shear.ext_single.lane,
                               S08_Max.Shear.ext_single.lane,S09_Max.Shear.ext_single.lane,
                               S10_Max.Shear.ext_single.lane)/Beamline[10,2], EXT.Multi = 
                               c(S00_Max.Shear.ext_multi.lane,S01_Max.Shear.ext_multi.lane,
                               S02_Max.Shear.ext_multi.lane,S03_Max.Shear.ext_multi.lane,
                               S04_Max.Shear.ext_multi.lane,S05_Max.Shear.ext_multi.lane,
                               S06_Max.Shear.ext_multi.lane,S07_Max.Shear.ext_multi.lane,
                               S08_Max.Shear.ext_multi.lane,S09_Max.Shear.ext_multi.lane,
                               S10_Max.Shear.ext_multi.lane)/Beamline[10,2], INT.Single = 
                               c(S00_Max.Shear.int_single.lane,S01_Max.Shear.int_single.lane,
                               S02_Max.Shear.int_single.lane,S03_Max.Shear.int_single.lane,
                               S04_Max.Shear.int_single.lane,S05_Max.Shear.int_single.lane,
                               S06_Max.Shear.int_single.lane,S07_Max.Shear.int_single.lane,
                               S08_Max.Shear.int_single.lane,S09_Max.Shear.int_single.lane,
                               S10_Max.Shear.int_single.lane)/Beamline[10,2], INT.Multi = 
                               c(S00_Max.Shear.int_multi.lane,S01_Max.Shear.int_multi.lane,
                               S02_Max.Shear.int_multi.lane,S03_Max.Shear.int_multi.lane,
                               S04_Max.Shear.int_multi.lane,S05_Max.Shear.int_multi.lane,
                               S06_Max.Shear.int_multi.lane,S07_Max.Shear.int_multi.lane,
                               S08_Max.Shear.int_multi.lane,S09_Max.Shear.int_multi.lane,
                               S10_Max.Shear.int_multi.lane)/Beamline[10,2])

Прямо сейчас я просто копирую и вставляю код еще 10 раз и меняю S00 на S01, S02 ... S10. Могу ли я сделать это с одним l oop?

1 Ответ

2 голосов
/ 28 марта 2020

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

apply_fun <- function(filename) {

   SS00 <- readxl::read_excel(filename, sheet = "Bridge Object Girder Forces", skip = 3, col_names = FALSE)
   S00_shear <- data.frame(S00[,5],SS00[,8],S00[,12])
   names(S00_shear) <- c("Girder", "Load", "Shear")

   # Split data for single lane loaded and multi lane loaded
   S00_Shear_multi.lane <- S00_shear[which(S00_shear$Load == "LL-1"),]
   S00_Shear_single.lane <- S00_shear[which(S00_shear$Load == "LL-Single"),]

   # Split data for the exterior girders and interior girders
   S00_Shear.ext_multi.lane <- subset(S00_Shear_multi.lane, Girder %in% c("Left Exterior Girder",
                                                                     "Right Exterior Girder"))
   S00_Shear.int_multi.lane <- subset(S00_Shear_multi.lane, Girder %in% c("Interior Girder 1",
                                                                     "Interior Girder 2",
                                                                     "Interior Girder 3"))

   S00_Shear.ext_single.lane <- subset(S00_Shear_single.lane, Girder %in% c("Left Exterior Girder",
                                                                       "Right Exterior Girder"))
   S00_Shear.int_single.lane <- subset(S00_Shear_single.lane, Girder %in% c("Interior Girder 1",
                                                                       "Interior Girder 2",
                                                                       "Interior Girder 3"))

  # Find the maximum shear values
 c(EXT.Multi = max(S00_Shear.ext_multi.lane$Shear), 
   INT.Multi   = max(S00_Shear.int_multi.lane$Shear), 
   EXT.Single  = max(S00_Shear.ext_single.lane$Shear), 
   INT.Single  = max(S00_Shear.int_single.lane$Shear))
}

Применить эту функцию ко всем файлам Excel и разделить значения на Beamline[10,2].

filenames <- list.files(pattern = 'S\\d+\\.xlsx', full.names = TRUE)
Beamline <- read.csv(file = "Beamline.csv", header = TRUE, sep = ",",row.names =1)

out <- data.frame(t(sapply(filenames, apply_fun)))/Beamline[10,2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...