【问题标题】:R code to open files one by one perform operations and close open fileR代码逐个打开文件执行操作并关闭打开的文件
【发布时间】:2020-03-30 10:17:36
【问题描述】:

我正在开发 R Studio。

我有大约 50 个 txt 文件,所有这些文件都有类似格式的数据(14 列以相同的顺序)。每个文件都很大(~100MB)。我将所有文件保存在一个文件夹中。我需要做的是编写一个 R 代码,以便我可以打开一个文件,执行一些操作,将输出写入目标文件并关闭文件。在此之后,我需要按照剩余文件的流程进行操作。我想自动化这个过程,但不确定如何继续。尝试搜索,但找不到我可以申请的内容。

我已经为一个文件完成了此操作,但不确定可以帮助我自动化处理 50 个文件的过程的代码。请求帮助.....

library(data.table)
library(dplyr)
library(tidyverse)

#### Opening One File
myfile=fread("C:/Users/shegu/Desktop/LOB30SCRIP_010318.txt", 
sep="|",header=FALSE, stringsAsFactors = TRUE)

#### Renaming cols
colnames(myfile) <- c("Trading_Session", "Scrip_Code", "Buy_Sell", 
        "Order_Type", "Rate_in_Paise", "Quantity","Avl_Quantity", "Order_Time_Stamp", 
        "Retention", "AUD_Code", "Order_ID", "Action_ID", "Error_Code","ALGO_Flag")

#### Changing Format of cols

myfile$Order_Time_Stamp=as.Date(myfile$Order_Time_Stamp, "%Y-%m-%d %H:%M:%S")
myfile$Scrip_Code=as.factor(myfile$Scrip_Code)
myfile$Order_ID=as.factor(myfile$Order_ID)

#### Performing Group-by operation (this needs to be done on each file in my folder)

myfile_by_AUD_Code=myfile%>%
    group_by(Scrip_Code,ALGO_Flag,AUD_Code)%>%
    summarise(n())

#### Writing results to target file (need results for all files in this target file)
       write.csv(myfile_by_AUD_Code,"C:/Users/shegu/Desktop/BSE_Data/Target.csv", 
       row.names = FALSE)

【问题讨论】:

  • 有条不紊地处理这个问题。生成所有文件的列表,并对列表中的所有文件执行操作。将输出保存到目标对象,然后将该对象写入文件。
  • 谢谢你。事实上,我无法想出一个一个打开文件并执行所需操作的代码。此外,我还会从 r 中删除该文件,因为每个文件的大小都很大。感谢您的帮助。

标签: r data-manipulation summarize


【解决方案1】:

您已经完成了大部分步骤。您只需要使用应用于目录中所有文件的函数来概括它们。我建议你以下。顺便说一句,你加载了太多的包:因为你使用 fread 保持 data.table 方法。

library(data.table)

files <- list.files("C:/Users/shegu/Desktop/",
                    full.names = TRUE, pattern = ".csv")


clean_file <- function(filename){

  data <- fread(filename, sep="|",header=FALSE, stringsAsFactors = TRUE)

  #### Renaming cols
  data.table::setnames(data, new = c("Trading_Session", "Scrip_Code", "Buy_Sell", 
                               "Order_Type", "Rate_in_Paise", "Quantity","Avl_Quantity", "Order_Time_Stamp", 
                               "Retention", "AUD_Code", "Order_ID", "Action_ID", "Error_Code","ALGO_Flag"),
                       old = colnames(data)
  )

  data[, Order_Time_Stamp := as.Date(Order_Time_Stamp, "%Y-%m-%d %H:%M:%S")]
  data[, Scrip_Code := as.factor(Scrip_Code)]
  data[, Order_ID := as.factor(Order_ID)]

  #### Performing Group-by operation (this needs to be done on each file in my folder)
  myfile_by_AUD_Code <- data[, .(nobs = .N) ,by = c("Scrip_Code","ALGO_Flag","AUD_Code")]

  ### Write file
  fwrite(myfile_by_AUD_Code, gsub(".csv","_summary.csv",filename))

  return(NULL)  
}

lapply(files,clean_file)

使用list.files 函数检测文件名。我添加了一个模式参数以确保仅列出 csv 文件。如果您的目录中有您不想阅读的文件,请添加其他元素。

我建议您将文件写为old_filename_summary.csv 如果不适合您,请更改该行。

其余的只是你的例子的data.table 中的一个翻译

【讨论】:

  • 感谢 linog 的详细解释。但是,当我运行代码时,出现以下错误: data.table::setnames(data, new = c("Trading_Session", "Scrip_Code", : 'old' is length 1 but 'new' is长度 14 。尝试通过查看 setnames 的问题来解决,但没有运气。如果您能提供同样的帮助,那就太好了..另外,如果您能帮助我了解何时放置要保存的目标文件的文件路径。谢谢再次为此花时间
  • 这意味着有些文件没有 14 列而是只有 1 列:它们没有使用"|" 作为分隔符。您的所有文件都没有相同的结构,或者您正在导入您不想要的文件。您确定您目录中的所有csv 都需要由R 导入吗?我将首先查看file 向量中的值,并确保只有您感兴趣的文件。也许创建一个仅包含您感兴趣的文件的子目录可能会有所帮助(然后更改目录list.files 指向)并过滤不需要的csv
  • 非常感谢 linog,它就像一个魅力。实际上,我的存储库中的一个文件具有不同数量的列。
猜你喜欢
  • 2017-08-09
  • 2021-11-02
  • 1970-01-01
  • 2021-07-16
  • 2012-10-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多