【问题标题】:What arguments for self-defined functions for use on list of data frames in R用于R中数据框列表的自定义函数的哪些参数
【发布时间】:2020-11-27 17:09:59
【问题描述】:

所以我一直在编写一个自动执行一些数据分析的脚本,而不是让用户在 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 中列表中的每个数据框?还是我需要手动定义? 非常感谢您的帮助!

【问题讨论】:

  • lapply 会将您的correct_backgroundmean_SD 函数应用于myheets 列表中的每个元素,但您需要保存其返回值以观察结果。我怀疑您还需要使用correct_background 的输出作为mean_SD 的输入。

标签: r function dataframe arguments


【解决方案1】:

您需要保存lapply 操作的结果。将您的 lapply 语句更改为以下内容。

#Apply background correction on every data frame in the list

mysheets <- lapply(mysheets, correct_background)

#Apply function to calculate mean and SD

mysheets <- lapply(mysheets, mean_SD)

【讨论】:

  • 感谢您的帮助。但是,我一直遇到同样的问题,如果我 lapply 列表中的 correct_background 函数,R 返回“未定义的列选择”错误。如果我隔离一个数据帧并在该数据帧上单独使用函数行,它就可以正常工作。有什么建议吗?
  • 你能分享一些你的excel文件中原始列名的例子吗?
  • 已经找到解决办法,再次感谢您的帮助!
  • "undefined columns selected" 当您的原始 df 中有列不适合 paste0('Background ', cols) 的简洁设计时,会发生。也许,只是也许,有一列有额外的空格或其他字符。同样,我想知道原始列名是准确的。
猜你喜欢
  • 2020-07-28
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 2020-10-28
  • 1970-01-01
  • 2016-04-13
  • 2021-09-20
相关资源
最近更新 更多