【问题标题】:How to operate on multiple files within a folder without having to load them into R如何对文件夹中的多个文件进行操作,而无需将它们加载到 R 中
【发布时间】:2018-05-06 13:19:18
【问题描述】:

作为我要解决的问题的一部分,我需要将 50 个文件附加到一个文件中。我希望如果我可以使用 for 循环来做同样的事情,但我无法这样做,因为 list.files() 只是给出了文件的文字名称而不是其中的数据。

有人可以帮我在 R 中执行类似的逻辑吗:

c = list.files()
for (i = 1:length(c))
{
  a = c[i]
  % any operation on 'a' since it now contains the data of the first file in c
}

但上面的方法似乎不起作用,因为“c”只有文件的字面名称,而不是数据。

有人可以指导我如何做到这一点吗?

【问题讨论】:

标签: r


【解决方案1】:

据我所知,如果不将文件加载到 R 中,就无法在 R 中执行此操作。但是,R 中有多种方法可以读取文件、组合它们,然后编写一个组合文件。下面是一个示例,我们假设我们要读取、合并并保存当前目录中的所有 csv 文件。

library(tidyverse)

map_df(list.files(pattern="csv$"), function(f) {
  read_csv(f)
}) %>% write_csv(., "New file.csv")

【讨论】:

    【解决方案2】:

    将文件名存储在一个对象中。

    > fl_list <- list.files()
    

    您可以看到目录中存在的文件

    > fl_list
    [1] "credit.csv"  "credit1.csv" "credit2.csv"
    [4] "credit3.csv"
    

    我想你想通过按行组合来追加数据,所以我使用了 rbind。

    您必须创建一个空数据框。

    > credit_main <- data.frame()
    

    现在您可以在存在的文件列表上运行旧的 for 循环并按行绑定它们。

    > for(i in 1:length(fl_list)){
    +   credit <- read.csv(fl_list[i])
    +   credit_main <- rbind(credit, credit_main)
    + }
    

    检查创建的新数据框的维度。

    > dim(credit_main)
    [1] 4000   10
    

    我在这个例子中使用了不同名称的同一个文件

    > dim(credit)
    [1] 1000   10
    

    【讨论】:

      【解决方案3】:

      有一种方法可以在不将文件读入 R 的情况下连接文件。可以使用 R 中的 system() 函数来执行连接文件的操作系统命令,例如 Linux / OS X 中的 cat 命令或Windows 中的type 命令。

      调整来自 kaggle.com 的 Alberto Barradas 的 Pokémon Stats 数据,我有一组 6 个 CSV 文件,每个文件用于前 6 代神奇宝贝。

      这是一个脚本,它从磁盘读取 CSV 文件的名称,并使用 paste() 将它们转换为 cat 命令,该命令可以在 OS X 中执行以将它们组合成单个 CSV 文件 output.csv .

      theGenFiles <- list.files(path="~/gitrepos/pokemonData/",
                                pattern="gen0[123456]\\.csv",
                                full.names=TRUE)
      fileString <- NULL
      for (i in 1:length(theGenFiles)) fileString <- paste(fileString,theGenFiles[i])
      
      theOSCmd <- paste("cat",fileString," > ~/gitrepos/pokemonData/output.csv")
      
      system(theOSCmd)
      

      问候,

      镜头

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-22
        • 2019-12-19
        • 1970-01-01
        • 2020-07-23
        • 2019-09-10
        • 2020-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多