Итак, я работал над сценарием, который выполняет некоторый анализ данных автоматически, вместо того, чтобы заставлять пользователя делать все вручную в Excel. Я хочу, чтобы R поместил все листы данного файла Excel как фреймы данных в список и сделал что-нибудь с каждым из этих фреймов данных, используя самоопределяемые функции. Вот мой код:
###Install required packages if necessary
if(!require("tidyverse")) install.packages("tidyverse")
if(!require("fs")) install.packages("fs")
if(!require("readxl")) install.packages("readxl")
if(!require("matrixStats")) iinstall.packages("matrixStats")
###Load required packages
library(tidyverse)
library(fs)
library(readxl)
library(matrixStats)
###Define functions
#Import all sheets into a list from an Excel file
read_excel_allsheets <- function(filename, tibble = FALSE) {
sheets <- readxl::excel_sheets(filename)
x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
if(!tibble) x <- lapply(x, as.data.frame)
names(x) <- sheets
x
}
#Subtract "Background" column from corresponding measurement column
correct_background <- function(df) {
cols <- grep('^\\d+$', names(df), value = TRUE)
new_cols <- paste0(cols, '_corrected')
df[new_cols] <- df[cols] - df[paste0('Background ', cols)]
}
#Calculate means and standard deviations and drop "_corrected" columns
mean_SD <- function(df) {
df$mean <- rowMeans(select(df, contains("_corrected")))
df$SD <- rowSds(as.matrix(select(df, contains("_corrected"))))
df <- subset(df, select = c("Wavelength", "mean", "SD"))
}
###Apply functions
#Load all Excel sheets of chosen file into a list of data frames
mysheets <- read_excel_allsheets(file.choose())
#Apply background correction on every data frame in the list
lapply(mysheets, correct_background)
#Apply function to calculate mean and SD
lapply(mysheets, mean_SD)
Теперь, когда он проваливается, находится в части ###Apply functions
. Первая функция, та, которая загружает листы Excel, работает нормально, но я думаю, мне нужно определить аргумент для второй и третьей функции, который сообщает им, что они должны работать с любым фреймом данных в списке независимо от его имени. Есть ли способ по умолчанию ссылаться на каждый фрейм данных в списке в R? Или мне нужно определить это вручную? Помощь очень ценится!