it-swarm.com.de

Wie kann ich den Namen eines Datenrahmens ändern?

Ich habe eine wiederkehrende Situation, in der ich einen Wert am Anfang eines langen Satzes von R-Code setze, der zum Subsetting eines oder mehrerer Datenrahmen verwendet wird. Etwas wie das:

city_code <- "202"

Am Ende des gesamten Prozesses möchte ich die Ergebnisse in einem Datenrahmen speichern, der entsprechend benannt wird, beispielsweise basierend auf dem Anhängen von "city_code" an einen allgemeinen Stub.

city_results <- paste("city_stats", city_code, sep = "")

Mein Problem ist, dass ich nicht herausfinden kann, wie ich den resultierenden Datenrahmen in "city_results" umbenennen kann. Es gibt viele Informationen darüber, wie die Spalten eines Datenrahmens umbenannt werden sollen, nicht jedoch, wie der Datenrahmen selbst umbenannt wird. Basierend auf einer vorgeschlagenen Antwort, hier eine Klarstellung:

Danke, @ Mike-weise. Hilfreich, um Hadleys Advanced R mit einem konkreten Problem in der Hand zu studieren.

library(dplyr)
gear_code <- 4
gear_subset <- paste("mtcars_", gear_code, sep = "")
mtcars_subset <- mtcars %>% filter(gear == gear_code)
head(mtcars_subset)
write.csv(mtcars_subset, file = paste(gear_subset, ".csv", sep = ""))

So kann ich das Subset in eine entsprechend benannte CSV-Datei schreiben. Ihr Vorschlag funktioniert zwar, aber ich kann zum Beispiel nicht auf den data.frame mit dem neuen Namen verweisen:

assign(gear_subset, mtcars_subset)
head(gear_subset)
6

Die Wahrheit ist, dass Objekte in R keinen Namen haben. Es gibt verschiedene Arten von Umgebungen, einschließlich einer globalen für jeden Prozess. Diese Umgebungen enthalten Namenslisten, die auf verschiedene Objekte verweisen. Zwei verschiedene Namen können auf dasselbe Objekt verweisen. Dies ist am besten zu meinem Wissen im Kapitel über Umgebungen von Hadley Wickhams Advanced R Buch .__ erklärt. http://adv-r.had.co.nz/Environments.html

Es gibt also keine Möglichkeit, den Namen eines Datenrahmens zu ändern, da nichts geändert werden muss. 

Sie können jedoch einen neuen Namen (wie newname) auf dasselbe Objekt (in Ihrem Fall ein Datenrahmenobjekt) als gegebenen Namen (wie oldname) verweisen lassen, indem Sie einfach Folgendes tun:

   newname <- oldname

Wenn Sie eine dieser Variablen ändern, wird eine neue Kopie erstellt und die internen Verweise sind nicht mehr identisch. Dies ist auf die Semantik "Kopieren bei Modifizieren" von R zurückzuführen. In diesem Beitrag finden Sie eine Erklärung: Was genau ist die Semantik von Copy-on-Modify in R und wo liegt die kanonische Quelle?

Hoffentlich hilft das. Ich kenne den Schmerz. Dynamische und funktionale Sprachen unterscheiden sich von statischen und prozeduralen Sprachen ...

Natürlich ist es möglich, einen neuen Namen für einen Datenrahmen zu berechnen und ihn mit dem Befehl assign in der Umgebung zu registrieren - und vielleicht suchen Sie danach. Eine anschließende Bezugnahme wäre jedoch ziemlich kompliziert.

Beispiel (vorausgesetzt, df ist der betreffende Datenrahmen):

   assign(  paste("city_stats", city_code, sep = ""), df )

Wie immer siehe die Hilfe für assign für weitere Informationen http://stat.ethz.ch/R-manual/R-devel/library/base/html/assign.html

Bearbeiten: Als Antwort auf Ihre Bearbeitung und verschiedene Kommentare zu den Problemen bei der Verwendung von eval(parse(...) könnten Sie den Namen wie folgt analysieren:

head(get(gear_subset))
13
Mike Wise

Im Allgemeinen sollten Sie nicht programmgesteuert Namen für Datenrahmen in Ihrer globalen Umgebung generieren. Dies ist ein guter Hinweis, dass Sie list verwenden sollten, um Ihr Leben zu vereinfachen. Siehe FAQ Wie erstelle ich eine Liste von Datenrahmen? für viele Beispiele und mehr Diskussion.

An Ihrem konkreten Beispiel würde ich es auf verschiedene Weise umschreiben.

library(dplyr)
gear_code <- 4
gear_subset <- paste("mtcars_", gear_code, sep = "")
mtcars_subset <- mtcars %>% filter(gear == gear_code)
head(mtcars_subset)
write.csv(mtcars_subset, file = paste(gear_subset, ".csv", sep = ""))

Das Ziel scheint zu sein, eine CSV mit dem Namen gear_X.csv zu schreiben, die die mtcars-Untermenge mit gear == X enthält. Um einen Zwischendatenrahmen nicht zu behalten, sollte dies in Ordnung sein:

gear_code <- 4
mtcars %>% filter(gear == gear_code) %>%
    write.csv(file = paste0('mtcars_', gear_code, '.csv'))

Aber wahrscheinlich codieren Sie es auf diese Weise, weil Sie es für jeden Wert von gear tun möchten, und hier hilft dplyr_group_by:

CSVs für alle Gänge

mtcars %>% group_by(gear) %>%
  do(csv = write.csv(file = sprintf("mt_gear_%s.csv", .[1, "gear"]), x = .)

Datenrahmen für jede Gangstufe:

Wenn Sie wirklich einzelne Datenrahmenobjekte für jede Getriebestufe wünschen, sollten Sie sie in einer Liste anzeigen lassen.

gear_df = split(mtcars, mtcars$gear)

Dies gibt Ihnen eine list von drei Datenrahmen, einen für jede Ebene von gear. Und sie sind bereits mit den Ebenen benannt, um den Datenrahmen mit allen gear == 4-Zeilen zu sehen, do

gear_df[["4"]]

Im Allgemeinen ist dies einfacher als mit drei umherfliegenden Datenframes. Alles, was Sie für alle Datenrahmen tun möchten, können Sie zur gleichen Zeit mit einer einzigen lapply machen. Selbst wenn Sie eine for-Schleife verwenden möchten, ist dies einfacher als eval(parse()) oder get().

1
Gregor