【问题标题】:Read all txt files from a folder and create seperate variable for each file in r [duplicate]从文件夹中读取所有 txt 文件并为 r [重复] 中的每个文件创建单独的变量
【发布时间】:2016-03-31 16:59:03
【问题描述】:

我的文件夹中有过去 15 年的年度库存数据,其中包含 15 个文件(一个文件/年)。这个文件夹也被设置为我的工作目录。我可以单独读取每个文件并将其保存到一个变量中,但我想创建一个循环或函数来读取所有文件并为每年创建一个变量。我已尝试使用以下代码,但无法获得所需的结果。有什么帮助吗?

分别读取每个文件:

allData_2000 <- read.csv("......../Data_1999-2015/scrip_high_low_year_2000.txt",sep = ",", header = TRUE, stringsAsFactors = FALSE)

allData_2001 <- read.csv("......../Data_1999-2015/scrip_high_low_year_2000.txt",sep = ",", header = TRUE, stringsAsFactors = FALSE)

但我想使用循环读取所有文件:

path <- "....Data_1999-2015"
files <- list.files(path=path, pattern="*.txt")

for(file in files)
{
        perpos <- which(strsplit(file, "")[[1]]==".")
        assign(
                gsub(" ","",substr(file, 1, perpos-1)), 
                read.csv(paste(path,file,sep=",",header = TRUE, stringsAsFactors = FALSE)))
}

【问题讨论】:

  • 我收到错误“找不到目标文件”。当我用 list.files(path) 检查它时,它会显示所有文件。但是用你的方法做我得到上面的错误信息
  • 试试list.files(path=path, pattern="*.txt", full.names = TRUE)
  • 啊,我看到了你的错误。首先,请注意您的粘贴命令包含所有read.csv 命令。然后请注意,您的路径和文件列表不包含分隔斜线。所以你会得到类似:......../Data_1999-2015scrip_high_low_year_2000.txt,当然这不是一个文件。尝试用read.csv(paste0(path, '/', file),sep=",",header = TRUE, stringsAsFactors = FALSE) 替换整个read.csv 部分。
  • @Archie 是您所有以“scrip_high_low_year_”开头的文件吗?
  • 最好创建一个数据框列表,而不是创建具有相关名称的单个对象。这样做更容易,也更灵活。

标签: r csv


【解决方案1】:

试试这个改进的代码:

 library(tools)
library(data.table)

files<-list.files(pattern="*.csv")
for (f in 1:length(files))
assign(paste("AllData_",gsub("[^0-9]","",file_path_sans_ext(files[[f]])),sep=""), fread(files[f]))

【讨论】:

    【解决方案2】:

    试试这样吧,也许吧。

    df_list = list()
    counter = 1
    for(file in files){
      temp_df = read.csv(paste0(path, '/', file), header=T, stringsAsFactors = F)
      temp_df$year = gsub('[^0-9]', '', file)
      df_list[[counter]] = temp_df
      counter = counter + 1
    }
    big_df = do.call(rbind, df_list)
    

    创建一个空列表,然后遍历文件,读取它们。删除文件中的所有非数字字符以获取年份(这基于您的文件在上面的样子:一些文本,以及年份; 如果文件看起来不是那样,您将需要与我所做的 gsub 不同的方法),并将其创建为新变量,然后将整个数据框存储在列表中。然后将数据帧绑定到最后的单个数据帧中。

    编辑:重读您的问题后,我不确定我告诉您的操作是否就是您想要做的。如果您只想将所有数据帧加载到内存中,并给它们一个变量以便您可以访问它们,而不是将它们放入单个数据帧中,我可能会这样做:

    df_list = list()
    for(file in files){
      temp_df = read.csv(paste0(path, '/', file), header=T, stringsAsFactors = F)
      year = gsub('[^0-9]', '', file)
      df_list[[year]] = temp_df
    }
    

    然后可以像这样访问每个数据框:df_list[['2000']] 将是 2000 年的数据框。

    【讨论】:

    • 我仍然收到错误消息“找不到对象文件”。
    • 好吧,我看到我犯了一个错误:将paste... 命令替换为paste0(path, '/', file)。无论如何,这将解决我遇到的错误。
    • 问题输出错误。
    • 输出有什么问题(至少是第二部分)?
    猜你喜欢
    • 2019-11-18
    • 2020-12-21
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    相关资源
    最近更新 更多