2017-09-10 2 views
-1

Ich versuche, eine Funktion zu erstellen, die mehrere Datentabellen in .csv-Dateien importieren/lesen kann, und dann Statistiken für die ausgewählten Dateien berechnen. Jede der 332 CSV-Datei enthält eine Tabelle mit den gleichen Spaltennamen: Datum, Schadstoff und ID. Es gibt viele fehlende Werte.R3.4.1 Lesen von Daten aus mehreren CSV-Dateien

Dies ist die Funktion, die ich bisher geschrieben hätte, den Mittelwert des Wertes für einen Schadstoff zu berechnen:

pollutantmean <- function(directory, pollutant, id = 1:332) { 

    library(dplyr) 
    setwd(directory) 
    good<-c() 

    for (i in (id)){ 
    task1<-read.csv(sprintf("%03d.csv",i)) 
    } 

    p<-select(task1, pollutant) 
    good<-c(good,complete.cases(p)) 
    mean(p[good,]) 
} 

Das Problem, das ich habe ist, dass jedes Mal durch die Schleife wird eine neue Datei geht gelesen und die Bereits gelesene Daten werden durch die Daten der neuen Datei ersetzt. Also ich am Ende mit einer Funktion funktioniert einwandfrei mit 1 einzigen Datei, aber nicht, wenn ich mehrere Dateien z. Wenn ich nach id = 10: 20 frage, habe ich den Mittelwert, der nur für Datei 20 berechnet wird.

Wie kann ich den Code ändern, damit ich mehrere Dateien auswählen kann?

Vielen Dank!

+0

Sie definieren 'good' als' c() 'am Anfang jeder Schleifeniteration neu. Um zu bekommen, was Sie wollen, sollten Sie 'gut '* außerhalb * der Schleife definieren. (Und während wir dabei sind, laden Sie Ihr Paket/setzen Sie Ihr Arbeitsverzeichnis auch außerhalb der Schleife.) –

Antwort

0

Vielleicht so etwas?

library(dplyr) 

pollutantmean <- function(directory, pollutant, id = 1:332) { 
    od <- setwd(directory) 
    on.exit(setwd(od)) 

    task_list <- lapply(sprintf("%03d.csv", id), read.csv) 
    p_list <- lapply(task_list, function(x) complete.cases(select(x, pollutant))) 
    mean(sapply(p_list, mean)) 
} 

Hinweise:
- Setzen Sie alle Ihre library Anrufe zu Beginn Ihrer Skripte, werden sie viel einfacher zu lesen sein. Nie in einer Funktion.
- Um ein Arbeitsverzeichnis innerhalb einer Funktion zu setzen, ist auch eine schlechte Idee. Wenn die Funktion zurückkehrt, ist diese Änderung immer noch aktiv und Sie könnten verloren gehen. Der bessere Weg ist, die externen Funktionen von wd zu setzen, aber da Sie es in der Funktion festgelegt haben, habe ich den Code entsprechend angepasst.

+0

danke! es funktioniert nicht genau so, da es immer noch mehrere Mittel mehrerer Tabellen berechnet und kein globales Mittel - aber es ist interessant, die Lappy-Funktion zu verwenden! –

+0

@ CécilePetit OK, ich werde meinen Code bearbeiten und ein globales Mittel berechnen lassen. –

+0

Danke In der Zwischenzeit habe ich meinen Code wie folgt geändert: –

1

Meine Antwort bietet eine Möglichkeit zu tun, was Sie tun möchten (wenn ich alles richtig verstanden habe), ohne eine Schleife zu verwenden. Meine zwei Annahmen sind: (1) Sie haben 332 *. CSV-Dateien mit der gleichen Kopfzeile (Spaltennamen) - so haben alle Dateien die gleiche Struktur, und (2) können Sie Ihre Tabellen zu einem großen Datenrahmen kombinieren.

Wenn diese beiden Annahmen stimmen, würde ich eine Liste Ihrer Dateien verwenden, um Ihre Dateien als Datenrahmen zu importieren (diese Antwort enthält also keine Schleifenfunktion!).

# This creates a list with the name of your file. You have to provide the path to this folder. 
file_list <- list.files(path = [your path where your *.csv files are saved in], full.names = TRUE) 

# This will create a list of data frames. 
mylist <- lapply(file_list, read.csv) 

# This will 'row-bind' the data frames of the list to one big list. 
mydata <- rbindlist(mylist) 

# Now you can perform your calculation on this big data frame, using your column information to filter or subset to get information of just a subset of this table (if necessary). 

Ich hoffe, das hilft.

+0

danke! Ich hatte nicht daran gedacht, die rbind-Funktion zu benutzen –