【问题标题】:How can I use this function on all files in a folder in R and save the outputs to new files?如何在 R 文件夹中的所有文件上使用此功能并将输出保存到新文件?
【发布时间】:2021-04-30 19:49:05
【问题描述】:

我编写了一些代码,需要应用于 62 个文件。我想我可以以某种方式使用 for 循环或 lapply 函数,但我正在努力想出一些可行的方法。这是我为清理数据而编写的函数:

clean.data <- function(messyData){

#remove rows with NA
messyData <- dplyr::filter(messyData, Name != 'NA')

#remove rows containing "similar" in Name
messyData <- dplyr::filter(messyData, !grepl('Similar', Name))

#standardize column 8 name (P_value_T)
names(messyData)[8]<-"P_value_T" 

#remove p-vals > .05
messyData <- dplyr::filter(messyData, P_value_T < .05)
messyData <- dplyr::filter(messyData, P_value_T != 'NA')

#remove duplicates
messyData <- messyData[!duplicated(messyData$Name),]

#keep only names
cleanData <- messyData[, c("Name")]

return(cleanData)
}

当我运行以下命令时:

messydf <- read.csv("res2.csv", na.strings = c("", "NA"), header = TRUE)
table <- clean.data(messydf)
write.table(table, file="res2_cleaned.txt", sep="\t", quote=FALSE)

我得到了正确的输出为 .txt! text file image

现在我需要对 res3.csv、res4.csv 等做同样的事情,并将它们保存到新文件中,可能是 res3_clean.csv、res4_clean.csv 等。

【问题讨论】:

    标签: r loops for-loop lapply data-cleaning


    【解决方案1】:

    在函数中也包含读写文件:

    clean.data <- function(filename){
      messydf <- read.csv(filename, na.strings = c("", "NA"), header = TRUE)
      #remove rows with NA
      messyData <- dplyr::filter(messyData, Name != 'NA')
      
      #remove rows containing "similar" in Name
      messyData <- dplyr::filter(messyData, !grepl('Similar', Name))
      
      #standardize column 8 name (P_value_T)
      names(messyData)[8]<-"P_value_T" 
      
      #remove p-vals > .05
      messyData <- dplyr::filter(messyData, P_value_T < .05)
      messyData <- dplyr::filter(messyData, P_value_T != 'NA')
      
      #remove duplicates
      messyData <- messyData[!duplicated(messyData$Name),]
      
      #keep only names
      cleanData <- messyData[, c("Name")]
      
      write.table(table, file= paste0('cleaned_', filename), sep="\t", quote=FALSE)
    }
    

    现在假设您要读取和更改的所有文件都在您的工作目录中,您可以使用 list.files 获取文件名并使用 lapply 应用函数。

    files <- list.files(pattern = '^res')
    lapply(files, clean.data)
    

    【讨论】:

      【解决方案2】:

      这里的解决方案相当优雅,但最初并不直观。此外,如果没有可重现的代码/数据,这有点棘手,但我相信这应该可行。

      假设您的文件都在工作目录 (WD) 的同一个文件夹中,您可以使用 list.files(pattern='*.csv') 函数列出文件夹中的所有文件(注意:拥有 WD 非常重要正确指定)。然后,创建一个空列表来存储循环中的“清理”数据。从“不干净”数据列表中,循环将每个 .csv 文件 i 保存为“dat”,应用您的 data.clean() 函数,将该 .txt 文件写入您的 WD(名称基于.csv 文件名的前四个字符;例如 res5.csv 现在是 res5_cleaned.txt),并将这些已清理的 .txt 文件存储到您的 WD。下面的代码应该就是你所需要的。

      setwd("~your working directory") # Or setwd within "Session" --> "Set Working Directory"
      
      file.list <- list.files(pattern='*.csv')  # Grabs data from WD and stores as list
      
      clean.list <- vector("list", length(file.list)) # Empty list to store cleaned data
      
      for(i in 1:length(file.list)){
        
        dat = read.csv(file.list[i], row.names = NULL) 
        
        clean.list[[i]] = clean.data(dat) # <-- Your function 
        
        file.name = paste(substr(file.list[i], start = 1, stop = 4), '_clean.txt', sep = "")
        
        write.table(clean.list[[i]], file = file.name)
      }
      

      您可能需要调整文件命名行以及如何导出数据(.txt、.csv 等)。希望这对你有用!保持健康!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-03
        • 1970-01-01
        • 2011-10-29
        相关资源
        最近更新 更多