绑定大型文件列表时设置列条件

时间:2017-03-21 11:16:12

标签: r conditional large-files

我被困住了。我已经定义了这些代码行,以便绑定我阅读解析其文件夹的不同csv。

setAs("character", "myDate", function(from) as.Date(from, format = "%d/%m/%Y"))

LF <- list.files("O:/00 CREDIT MANAGEMENT/", pattern = ".csv", full.names = TRUE, recursive = FALSE)

PayMatrix <- do.call("rbind", lapply(archivos1, function(x) {
  read.csv(x, header = 3, sep = ";", dec = ",", skip = "2", na.strings = "", 
           colClasses= c("Expiration.Date" = "myDate", "Payment.date" = "myDate"))
}))

我的问题是它是一个非常大的数据集,我想知道如何根据“Payment.Date”列的值(即Payment.Date&gt; 0)有条件地解析此csv,同样,我将只使用那些csv中的一小部分列,所以我想在循环之前或期间剪切文件。

我尝试了“awk”的事情,但它没有用。

{read.csv(pipe("awk '{if (Payment.date > 0) print [,c(1:2,6:9,29)]}'x"), header=3...

我的输入文件类似于此。 (csv,header = 3)

            CURRENT INVOICES 27/03/2017 (W 13)  
            16276178,26 
Client Code.  Invoice   Invoice Date    Expiration Date Amount  Payment date
1004775     21605000689 29/05/2016        29/07/2016    226,3   
1005140     21702000548 28/02/2017        28/04/2017    22939,2 
1004775     21703005560 25/03/2017        25/05/2017    21456,2 
1004858     F9M01815.   30/01/2017        30/03/2017    5042,52 27/03/2017

1 个答案:

答案 0 :(得分:1)

lapply()功能中的选择是否适合您? (由于缺乏可重复的例子而未经测试)

PayMatrix <- do.call("rbind", lapply(archivos1, function(x) {
  tmp <- read.csv(x, header = 3, sep = ";", dec = ",", skip = "2", na.strings = "", 
           colClasses= c("Expiration.Date" = "myDate", "Payment.date" = "myDate"))
  tmp[tmp$Payment.Date > 0, ]
}))

BTW:为了有效处理大数据帧,我建议考虑使用data.table包。这样,您的代码就可以(未经测试)

library(data.table)
PayMatrix <- rbindlist(lapply(archivos1, function(x) {
  fread(x, <...>)[Payment.Date > 0, ]
}))

其中&lt; ...&gt;表示必须传递给fread()的参数。

BTW:fread()包中的data.table函数不仅仅适用于大文件的速度。它为小数据提供了非常有用的便利功能。有关详细信息,请参阅fread's wiki page