【问题标题】:R: Loop to Read Multiple Excel Files in List [duplicate]R:循环读取列表中的多个Excel文件[重复]
【发布时间】:2020-06-17 01:01:33
【问题描述】:

我有两个列表,一个包含我想读取的 excel 文件路径,另一个包含我想分配给每个文件名的文件名作为数据框。尝试使用以下代码创建一个循环,但该循环仅创建一个名称为 n 的数据帧。知道如何完成这项工作吗?

 files <- c("file1.xlsx","file2.xlsx")
 names <- c('name1','name2')

 for (f in files) {
 for (n in names)   {
 n <- read_excel(path = f)
  }
 }

【问题讨论】:

  • 在 SO 的 R 帖子中已经多次提到将许多类似的数据帧保存到一个列表中,而不是作为淹没您的全球环境的单独对象。见canonical answer
  • 在链接的帖子中将read.csv 更改为read_excelread_xlsx

标签: r excel


【解决方案1】:

您在循环的每次迭代中覆盖n

编辑:

@Parfait 评论说,如果可以避免,我们不应该使用assign,他是对的(例如why-is-using-assign-bad

这不使用 assign 并将数据放在一个整洁的列表中:

files <- c("file1.xlsx","file2.xlsx")
names <- c('name1','name2')

result <- list()
for (i in seq_along(files)) {
  result[names[i]] <- read_excel(path = files[i]))
}

旧的且不推荐的答案(仅出于透明原因留在这里):

我们可以使用assign来使用字符串作为变量名:

files <- c("file1.xlsx","file2.xlsx")
names <- c('name1','name2')

for (i in seq_along(files)) {
  assign(names[i], read_excel(path = files[i]))
}

【讨论】:

  • 由于双循环,这将无法正常工作。 file2.xlsx 将同时写入name1name2
  • @Miff 非常感谢!我编辑了我的答案
  • assignattach 几乎相同,作为 R 中要避免的方法。
  • @Parfait 谢谢你的评论。我试图在我的编辑中考虑到它。
  • 编辑(使用预分配的result &lt;- list()好多,解决了像这样的努力中最大的错误:(1)没有“增长的对象”; (2) 不使用get 和/或assign。 @dario,如果你要保留原来的答案,你会考虑把它移到最后,以便首选答案是第一位的吗?
【解决方案2】:

另一种方法是遍历文件夹中的所有 Excel 文件,而不是列表。我假设它们存在于某个文件夹中的某个地方。

# load names of excel files 
files = list.files(path = "C:/your_path_here/", full.names = TRUE, pattern = ".xlsx")

# create function to read multiple sheets per excel file
read_excel_allsheets <- function(filename, tibble = FALSE) {
  sheets <- readxl::excel_sheets(filename)
  sapply(sheets, function(f) as.data.frame(readxl::read_excel(filename, sheet = f)), 
         simplify = FALSE)
}

# execute function for all excel files in "files"
all_data <- lapply(files, read_excel_allsheets)

更新...

【讨论】:

  • 强烈推荐反对这种方法:参见第 2 章:The R Inferno 中的对象增长。
  • 我认为该代码有效,但我没有对其进行测试。我刚刚用似乎运行良好的代码示例更新了我的答案。这些天我真的更喜欢 Python。我曾经做过一些 R 编码,但我几乎不再接触它了。
  • 即使在 Python 中你也想避免growing object in a loop
猜你喜欢
  • 1970-01-01
  • 2015-04-23
  • 2014-04-19
  • 2021-06-24
  • 2011-08-11
  • 1970-01-01
  • 2018-10-08
  • 2021-04-21
  • 1970-01-01
相关资源
最近更新 更多