2017-03-21 3 views
-1

Ich bin fest. Ich habe diese Codezeilen definiert, um verschiedene CSVs zu binden, die ich beim Parsen ihrer Ordner lese.Legen Sie Spalten Bedingungen beim Binden einer großen Liste von Dateien

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")) 
})) 

Mein Problem ist, dass es eine sehr große Menge von Daten ist, und ich würde gerne wissen, wie diese csv Parsen bedingt für den Wert von „Payment.Date“ Spalte abhängig (dh Payment.Date> 0), ich werde auch nur ein paar Teile der Spalten in diesen csv verwenden, also möchte ich die Dateien vor oder während der Schleife schneiden.

Ich habe das "awk" Ding versucht, aber es funktioniert nicht.

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

Meine Eingabedateien sind etwas ähnliches. (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 
+0

Die Eingabedatei scheint nicht mit den Parametern des Aufrufs von 'read.csv()' übereinzustimmen, insbesondere 'sep ="; "'. – Uwe

Antwort

1

Würde eine Auswahl innerhalb der lapply() Funktion für Sie arbeiten? (Ungetestet wegen des Mangels an reproduzierbaren Beispiel)

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: Für effizient große Datenrahmen Handhabung, empfehle ich das data.table Paket verwenden zu berücksichtigen. Damit könnte der Code werden (ungetestet)

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

wo < ...> die Parameter bezeichnen, die zu fread() weitergegeben werden müssen.

BTW: Die fread() Funktion im data.table Paket ist nicht nur für die Geschwindigkeit auf große Dateien. Es hat sehr nützliche Komfortfunktionen für kleine Daten. Einzelheiten finden Sie unter fread's wiki page.

+1

Bitte verwenden Sie nur data.table für große Dateien, es ist absolut unvergleichbar zu Base r in Bezug auf Effizienz und Geschwindigkeit – Alexvonrass

+1

@Alexvonrass Vielen Dank für die Unterstützung meines Vorschlags, 'data.table' zu ​​verwenden! – Uwe

+0

Danke. Ich bin nicht in der Lage zu machen, dass Fread funktioniert ... Ich kann den Header und die Überspringen-Zeilen nicht reparieren ... kann, weil ich einige unregelmäßige Dateien habe. Ich verwende rbindlist. Ich kann die Bedingungen mit deinem Code auch nicht so willig machen, ich kann es nicht erkennen lassen. –

Verwandte Themen