【问题标题】:How to read all the files in a folder using R and create objects with the same file names?如何使用 R 读取文件夹中的所有文件并创建具有相同文件名的对象?
【发布时间】:2015-12-16 10:02:57
【问题描述】:

我需要在 R 中创建一个函数来读取文件夹中的所有文件(假设所有文件都是制表符分隔格式的表格)并在全局环境中创建具有相同名称的对象。我做了类似的事情(见下面的代码);我能够编写一个函数来读取文件夹中的所有文件,在每个文件的第一列中进行一些更改并将其写回文件夹。但是我找不到如何将读取的文件分配给将留在全局环境中的对象。

changeCol1 <- function () {
     filesInfolder <- list.files()
     for (i in 1:length(filesInfolder)){
         wrkngFile <- read.table(filesInfolder[i])
         wrkngFile[,1] <- gsub(0,1,wrkngFile[,1])
         write.table(wrkngFile, file = filesInfolder[i], quote = F, sep = "\t")
         }
     }

【问题讨论】:

    标签: r function object assign read.table


    【解决方案1】:

    最好将它们全部分配给名为 list 的元素(而且这也很容易做到):

    changeCol1 <- function () {
      filesInfolder <- list.files()
      lapply(filesInfolder, function(fname) {
        wrkngFile <- read.table(fname)
        wrkngFile[,1] <- gsub(0, 1, wrkngFile[,1])
        write.table(wrkngFile, file=fname, quote=FALSE, sep="\t")
        wrkngFile
      }) -> data
      names(data) <- filesInfolder
      data
    }
    
    a_list_full_of_data <- changeCol1()
    

    另外,F 总有一天会回来困扰您(FALSETRUE 所在的位置不受保护)。

    【讨论】:

    • 感谢关于 T 和 F 的提示。这些天我一直在使用 T 和 F,从没想过它会成为问题。
    【解决方案2】:

    在进行更改后将其添加到您的循环中:

    assign(filesInfolder[i], wrkngFile, envir=globalenv())
    

    如果您想将它们放入列表中,一种方法是在循环之外声明一个列表:

    mylist = list()
    

    然后,在你的循环中,这样做:

    mylist[[filesInfolder[i] = wrkngFile]]
    

    然后你可以通过查看来访问每个对象:

    mylist[[filename]]
    

    来自全球环境。

    【讨论】:

    • 这对我帮助很大。谢谢
    • 顺便说一句——仅仅因为你可以这样做,并不意味着你应该......更好的方法是正如@hrbrmstr 所说,可能会将这些变量放入一个列表中。我只是按照你提出的问题回答你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多