【问题标题】:for Loop in R not binding filesR中的for循环不绑定文件
【发布时间】:2020-04-06 21:00:47
【问题描述】:

我对 R 比较陌生,所以如果这是一个非常基本的问题,我深表歉意。

我正在尝试使用 list.files(pattern) 方法读取两个 Excel 文件,然后使用 for 循环绑定文件并替换绑定文件中的值。但是,我的脚本生成的输出只是一个文件的输出,这意味着它没有绑定。

文件名是fact_import_2020fact_import_20182019

FilePath <- "//srdceld2/project2/"
FileNames <- list.files(path = FilePath, pattern = "fact_import_20", all.files = FALSE,
                        full.names = FALSE, recursive = FALSE,
                        ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE)

FileCount <- length(FileNames)

for(i in 1:FileCount){
  MOH_TotalHC_1 <- read_excel(paste(FilePath, "/", FileNames[i], sep = ""), sheet = 1, range = cell_cols("A:I"))
  MOH_TotalHC_2 <- read_excel(paste(FilePath, "/", FileNames[i], sep = ""), sheet = 1, range = cell_cols("A:I"))
  MOH_TotalHC <- rbind(MOH_TotalHC_1, MOH_TotalHC_2)
  MOH_TotalHC <- MOH_TotalHC[complete.cases(MOH_TotalHC), ]

【问题讨论】:

  • 仅供参考,在 SE formatting 中,代码块 (1) 只需要一行中的三个反引号,该行上没有代码; (2) 他们受益于在该行文本上添加一种语言,lang-r 这里; (3) close-fence (在代码末尾) 也需要全部在一行上,之前或之后都没有。当您的代码看起来直观且分离时,它确实很有帮助,即使主要是一种风格。感谢您从您所做的事情开始,尽管您上次的编辑只是抹杀了我的修复...请参阅我最近的编辑以获得进一步的建议。
  • ...但是拥有自给自足的代码会有所帮助,但事实并非如此。至少,您的for 循环中缺少一个右大括号}。此外,您是否有理由明确执行full.names=FALSE 然后paste(FilePath,"/",FileNames[i],sep="")?这完全没有必要(正如 Sathish 的回答所暗示的那样)。

标签: r for-loop


【解决方案1】:

list.files() 中使用full.names = TRUE

在此之后,确保FileNames 具有文件的完整路径。

然后循环遍历文件名,而不是文件计数。


我认为,您正在尝试这样做。我猜这里。请看下文。

您正在从一个文件中获取数据,因为您正在使用文件 1 中的数据覆盖文件 2 中的数据。 for() 循环表示它。

FileNames <- list.files(path = FilePath, pattern = "fact_import_20", all.files = FALSE,
                        full.names = TRUE, recursive = FALSE,
                        ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE)

# list of data from excell files
df_lst <- lapply(FileNames, function(fn){
  read_excel(fn, sheet = 1, range = cell_cols("A:I"))
})

# combine both data
MOH_TotalHC <- do.call('rbind', df_lst)
# complete cases
MOH_TotalHC[complete.cases(MOH_TotalHC), ]

【讨论】:

  • 感谢您的回答!我试过了,输出仍然有同样的问题。我在 MOH_TotalHC_2 中重复相同的操作以读取第二个 Excel 文件。我尝试更改列范围,但如果列范围不同,它不会让我 rbind。
【解决方案2】:

潜在的解决方案如下。此解决方案取自here,看起来像 重复的问题。

可能的解决方案:

library(readxl)
library(data.table)

#Set your path here
FilePath <- "//srdceld2/project2/"

#Update the pattern to suit your needs. Currently, its just set for XLSX files
file.list <- list.files(path = FilePath, pattern = "*.xlsx", full.names = T)
df.list <- lapply(file.list, read_excel, sheet = 1, range = cell_cols("a:i"))
attr(df.list, "names") <- file.list
names(df.list) <- file.list
setattr(df.list, "names", file.list)

#final data frame is here
dfFinal <- rbindlist(df.list, use.names = TRUE, fill = TRUE)

假设和标注:

  1. 文件夹中的文件是相似的文件类型。例如 xlsx。
  2. 文件可能有不同的列集和 NULL。
  3. 请注意,列的顺序很重要,因此如果新文件中有更多列,则输出列的数量可能会有所不同。

注意:和@Sathish 一样,我猜测输入会是什么样子

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2011-10-09
    • 2021-07-23
    • 2018-03-17
    相关资源
    最近更新 更多