2015-04-01 3 views
18

Ich habe eine for loop, die nach jeder Iteration einen Datenrahmen erzeugt. Ich möchte alle Datenrahmen zusammenfügen, aber es schwierig finden. Es folgt, was ich versuche, schlagen Sie bitte, wie es zu beheben:Datenrahmen in einer for-Schleife zusammenfügen

d = NULL 
for (i in 1:7){ 

# vector output 
model <- #some processing 

# add vector to a dataframe 
df <- data.frame(model) 

} 

df_total <- rbind(d,df) 

Antwort

43

Tun Sie es nicht innerhalb der Schleife. Erstellen Sie eine Liste und kombinieren Sie sie dann außerhalb der Schleife.

datalist = list() 

for (i in 1:5) { 
    # ... make some data 
    dat <- data.frame(x = rnorm(10), y = runif(10)) 
    dat$i <- i # maybe you want to keep track of which iteration produced it? 
    datalist[[i]] <- dat # add it to your list 
} 

big_data = do.call(rbind, datalist) 
# or big_data <- dplyr::bind_rows(datalist) 
# or big_data <- data.table::rbindlist(datalist) 

Dies ist eine viel mehr R-ähnliche Möglichkeit, Dinge zu tun. Es kann auch wesentlich schneller sein, besonders wenn Sie dplyr::bind_rows oder data.table::rbindlist für die endgültige Kombination von Datenrahmen verwenden.

+0

Es funktioniert auch, aber ich möchte alle Listen in separaten Spalten schreiben – Ibe

+0

@Ibe sollten Sie wirklich Ihre Frage dann bearbeiten. Geben Sie Beispieldaten und die gewünschte Ausgabe an (siehe mein Kommentar in MaRtins Antwort) und nehmen Sie 'rbind' aus Ihrer Frage heraus, weil alle' rbind' Zeilen aneinander binden. – Gregor

+1

hat "rbind" in Ihrem Code durch 'cbind' ersetzt. Es funktionierte und jetzt habe ich alle Listen in separaten Spalten – Ibe

2

gerade diese versuchen:

df_total = data.frame() 
for (i in 1:7){ 

# vector output 
model <- #some processing 

# add vector to a dataframe 
df <- data.frame(model) 
df_total <- rbind(df_total,df) 
} 
+0

Es hängt in einzelnen Spalte Rahmen nach dem Rahmen. Wie füge ich alle Datenrahmen in getrennten Spalten an? – Ibe

+0

Verwendung von cbind() anstelle von rbind() – maRtin

+0

Verwendung von 'cbind()' führte zu 'Fehler in data.frame (..., check.names = FALSE): Argumente implizieren unterschiedliche Anzahl von Zeilen: 0, 18262 ' – Ibe

2

Wieder Märtin korrekt ist, aber dafür Sie anfangen zu arbeiten, haben mit einem Datenrahmen, die bereits hat mindestens eine Spalte

model <- #some processing 
df <- data.frame(col1=model) 

for (i in 2:17) 
{ 
    model <- # some processing 
    nextcol <- data.frame(model) 
    colnames(nextcol) <- c(paste("col", i, sep="")) # rename the comlum 
    df <- cbind(df, nextcol) 
} 
+0

funktioniert es aber fügt Daten in einer einzelnen Spalte an. Ich möchte, dass alle Datenrahmen in getrennten Spalten sind – Ibe

1

Im Coursea-Kurs, eine Einführung in die R-Programmierung, wurde diese Fähigkeit getestet. Sie gaben allen Studenten 332 separate CSV-Dateien und baten sie, mehrere der Dateien programmatisch zu kombinieren, um den Mittelwert des Schadstoffs zu berechnen.

Dies war meine Lösung:

# create your empty dataframe so you can append to it. 
    combined_df <- data.frame(Date=as.Date(character()), 
        Sulfate=double(), 
        Nitrate=double(), 
        ID=integer()) 
    # for loop for the range of documents to combine 
    for(i in min(id): max(id)) { 
    # using sprintf to add on leading zeros as the file names had leading zeros 
    read <- read.csv(paste(getwd(),"/",directory, "/",sprintf("%03d", i),".csv", sep="")) 
    # in your loop, add the files that you read to the combined_df 
    combined_df <- rbind(combined_df, read) 
    } 
Verwandte Themen