2016-06-24 12 views
0

Ich habe eine sehr einfache Frage über lapply. Ich wechsle von STATA zu R und ich denke, dass es ein sehr grundlegendes Konzept gibt, das ich in R nicht verstehe. Aber ich habe den ganzen Nachmittag darüber gelesen und kann keinen vernünftigen Weg finden, diese sehr einfache Sache zu machen .Rückkehr von der Liste zu data.frame nach dem Lapply

Ich habe drei Datenrahmen DF1, DF2 und DF3, die alle die gleichen Spaltennamen haben, in der gleichen Reihenfolge, usw.

ich auf einmal ihre Spalten umbenennen möchten.

habe ich den Datenrahmen in einer Liste:

dflist <- list(df1, df2, df3) 

Was ich die neuen Namen sein will: eine Funktion

varlist <- c("newname1", "newname2", "newname3") 

schreiben, deren Namen mit denen in varlist ersetzt, und lapply es über die Datenrahmen

ChangeNames <- function(x) { 
    names(x) <- varlist 
    return(x) 
} 

dflist <- lapply(dflist, ChangeNames) 

So weit ich verstehe, hat R die Namen der Kopien der geändert Datenrahmen, die ich in die Liste einfüge, aber nicht die ursprünglichen Datenrahmen selbst. Ich möchte die Datenrahmen selbst umbenannt werden, nicht die Elemente der Liste (die in einer Liste gefangen sind).

Jetzt kann ich

df1 <- as.data.frame(dflist[1]) 
df2 <- as.data.frame(dflist[2]) 
df2 <- as.data.frame(dflist[3]) 

gehen Aber das scheint seltsam. Sie benötigen eine Schleife, um die Elemente einer Schleife zurückzubekommen?

Grundsätzlich: Sobald Sie einige Datenrahmen in eine Liste eingefügt haben und Ihre Funktion über sie ausführen, wie erhalten Sie sie wieder aus der Liste, ohne auf Platz eins zurück zu starten?

+1

ich die mehr R Art und Weise denken Sie gehen über den 3-Daten zu binden, wäre Rahmen zusammen, um etwas mit wie 'bigdf <- dplyr :: bind_rows (dflist, .id = "dfid") ', dann bei Bedarf in die Spalte' dfid' unterteilen. – Nick

+1

Wenn die data.frames eine ähnliche Struktur haben, ist es eine gute Idee, sie in einer Liste zu belassen und von dort aus mit ihnen zu arbeiten.Sehen Sie [diesen Beitrag] (http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames) insbesondere, gregors Antwort darauf, warum dies eine gute Technik ist. – lmo

+0

Vielen Dank Imo für mich auf diese Antwort von Gregor gerichtet. Sehr hilfreich. – VaguelySteamy

Antwort

1

Wenn Sie nur die Namen ändern möchten, ist das in R nicht zu schwer. Beachten Sie, dass der Zuweisungsoperator <- nacheinander angewendet werden kann. Daraus folgt:

names(df1) <- names(df2) <- names(df3) <- c("newname1", "newname2", "newname3") 
0

Ich bin nicht sicher, ob ich das richtig verstehen, haben Sie die Spalten des Datenrahmen oder die Komponenten der Liste umbenennen mögen, dass der Datenrahmen enthält?

Wenn es der erste ist, bitte immer vor der Frage suchen, die Frage wurde here gestellt.

Also, was Sie leicht tun können, falls Sie noch mehr Datenrahmen in der Liste haben, ist:

# Creating some sample data first 
> dflist <- list(df1 = data.frame(a = 1:3, b = 2:4, c = 3:5), 
+ df2 = data.frame(a = 4:6, b = 5:7, c = 6:8), 
+ df3 = data.frame(a = 7:9, b = 8:10, c = 9:11)) 

# See how it looks like 
> dflist 
    $df1 
    a b c 
1 1 2 3 
2 2 3 4 
3 3 4 5 

$df2 
    a b c 
1 4 5 6 
2 5 6 7 
3 6 7 8 

$df3 
    a b c 
1 7 8 9 
2 8 9 10 
3 9 10 11 

# And do the trick 
> dflist <- lapply(dflist, setNames, nm = c("newname1", "newname2", "newname3")) 

# See how it looks now 
> dflist 

$df1 
    newname1 newname2 newname3 
1  1  2  3 
2  2  3  4 
3  3  4  5 

$df2 
    newname1 newname2 newname3 
1  4  5  6 
2  5  6  7 
3  6  7  8 

$df3 
    newname1 newname2 newname3 
1  7  8  9 
2  8  9  10 
3  9  10  11 

So sind die Namen wurden geändert von a, b und c-newname1, newname2 und newname3 für alle Daten Rahmen in der Liste.

Wenn es das zweite ist, können Sie dies tun:

> names(dflist) <- c("newname1", "newname2", "newname3") 
+0

Hallo. Meine Frage war nicht so sehr das Umbenennen, sondern auch das effiziente Abrufen von Datenframes aus einer Liste nach dem Ausführen von Funktionen mit Lappy auf ihnen. Ich habe gerade den Umbenennungs-Artikel hinzugefügt, da dies das besondere Beispiel ist, mit dem ich gerade arbeite, und ich weiß, dass Sie sehr detaillierte Fragen stellen müssen. Vielleicht wäre es ein besserer Weg zu sagen: – VaguelySteamy

+0

- Beginnen Sie mit N (möglicherweise großen) Datenrahmen mit ähnlicher Struktur - setzen Sie sie in eine Liste, verwenden Sie lapply, um alle Operationen auszuführen (umbenennen, putzen, neu codieren usw.)) - dann möchte ich sie als data.frames wiederherstellen, damit ich sie einzeln/heterogen analysieren kann. Wie bekomme ich die gereinigten Elemente der Liste aus der Liste und wieder als normale data.frames (wie es am Anfang war) Die Gregor Post, dass Imo mich angeleitet, schlägt vor, dass ich einfach nicht darüber sorgen und alles behalten sollte in Listen die ganze Zeit. – VaguelySteamy

Verwandte Themen