Anwendung von Funktionen für mehrere Dataframes gleichzeitig

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Mad Rugada
Beiträge: 4
Registriert: Do Okt 25, 2018 4:26 am

Anwendung von Funktionen für mehrere Dataframes gleichzeitig

Beitrag von Mad Rugada »

Ich würde gerne Funktionen gleichzeitig für mehrere Dataframes anwenden. Hier ein vereinfachtes Beispiel:

Ich habe zwei Dataframes, die ich in eine Liste verpacke:

Code: Alles auswählen

df1 <- data.frame(col = 1:3)
df2 <- data.frame(col = 4:6)

df_list <- list(df1, df2) 
Die beiden Dataframes sehen so aus:

Code: Alles auswählen

df1 
col
1   1
2   2
3   3

df2 
col
1   4
2   5
3   6
Nun möchte ich bei beiden Dataframes die Werte durch 10 teilen. Hierzu wende ich diesen Code an:

Code: Alles auswählen

 df_list_10 <- lapply(df_list, function (x) {x/10}) 
Das klappt. Alle Werte wurden durch 10 geteilt. Allerdings haben sich nur die Werte in der neuen Liste (df_list_10) geändert; nicht jedoch die Werte in df1 und df2 selbst.

Ich habe daraufhin versucht aus der Liste wieder Dataframes mit df <- do.call(rbind.data.frame, df_list) zu machen, aber ich erhalte dann ein einziges aus df1 und df2 zusammengesetzes Dataframe.

Gibt es eine einfache Methode, wie ich eine Funktion auf mehrere Dataframes gleichzeitig anwende und diese Dataframes sofort überschrieben werden?

Mein Wunsch ist es Folgendes zu erhalten, ohne dass ich neue Dataframes schreiben muss:

Code: Alles auswählen

df1 
col
1   0,1
2   0,2
3   0,3

df2 
col
1   0,4
2   0,5
3   0,6
 
Ich freue mich auf Antworten!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Anwendung von Funktionen für mehrere Dataframes gleichzeitig

Beitrag von jogo »

Code: Alles auswählen

 df_list_10 <- lapply(df_list, function(x) { x$col <- x$col/10; return(x) }) 
Denke daran:
1. Du klapperst mit lapply() die Liste der Dataframes ab. Ein einzelnes Element (also das x in Deiner Funktion) ist ein Dataframe.
2. Du must den ganzen Dataframe zurückliefern, denn in R gilt generell call-by-value - das heißt, eine Funktion kann die Werte der Parameter nicht in der aufrufenden Umgebung ändern.

Gruß, Jörg
Mad Rugada
Beiträge: 4
Registriert: Do Okt 25, 2018 4:26 am

Re: Anwendung von Funktionen für mehrere Dataframes gleichzeitig

Beitrag von Mad Rugada »

Also es bedeutet, dass ich keine Funktionen auf mehrere Dataframes gleichzeitig anwenden kann und diese alle sofort überschrieben werden?

Die Liste der Dataframes habe ich ja mit meinem Code ebenfalls hinbekommen. Dort sind die Werte durch 10 geteilt. Aber es geht darum, dass ich keine Liste möchte, da ich über 6000 Dataframes habe, die unterschiedlich lang, groß und kompliziert sind; ich würde sie sehr ungerne miteinander kombinieren. Ich möchte nur ein paar Funktionen auf alle gleichzeitig anwenden. Zum Beispiel alle durch eine Zahl teilen.

Also wenn ich beispielsweise meine Liste aus 6000 Dataframes schreibe und dann meine Funktion mit df_list_10 <- lapply(df_list, function(x) { x$col <- x$col/10; return(x) }) durchführe, dann muss ich als weiteren Schritt 6000 Codes einzeln schreiben, um meine ursprüglichen 6000 Dataframes mit den neuen Werten zu erhalen? Also so?

Code: Alles auswählen

df1_neu <- df_list_10[[1]]
df2_neu <- df_list_10[[2]]
df3_neu <- df_list_10[[3]]
df4_neu <- df_list_10[[4]]
df5_neu <- df_list_10[[5]]
df6_neu <- df_list_10[[6]]
df7_neu <- df_list_10[[7]]
df8_neu <- df_list_10[[8]]
df9_neu <- df_list_10[[9]]
df10_neu <- df_list_10[[10]]
df11neu <- df_list_10[[11]]
df12_neu <- df_list_10[[12]]
df13_neu <- df_list_10[[13]]
df14_neu <- df_list_10[[14]]
df15_neu <- df_list_10[[15]]
...
5984 Codes später
...
df6000_neu <- df_list_10[[6000]]

Geht sowas kürzer?
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Anwendung von Funktionen für mehrere Dataframes gleichzeitig

Beitrag von Athomas »

Ist Dir schon mal der Verdacht gekommen, dass Du einfach eine völlig inadäquate Datenstruktur zur Repräsentierung Deiner Daten gewählt hast?

Wenn ich Dich richtig verstehe, hast Du Dir eine Liste von Matrizen (die Inhalte der Dataframes sind offenbar alle numerisch, sonst würde die von Dir angegebene Operation "dividiere alles durch 10" keinen Sinn machen) erzeugt.

Warum wählst Du nicht die Darstellung (Datensatz Nr., Zeile Nr., Spalte Nr., Inhalt) in einem einzigen Dataframe?
Daraus kannst Du Dir bei Bedarf leicht Daten extrahieren und in die ursprüngliche Struktur zurückverwandeln...
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Anwendung von Funktionen für mehrere Dataframes gleichzeitig

Beitrag von jogo »

Mad Rugada hat geschrieben: Sa Okt 27, 2018 1:05 am Also es bedeutet, dass ich keine Funktionen auf mehrere Dataframes gleichzeitig anwenden kann und diese alle sofort überschrieben werden?
Entschuldige bitte, ich verstehe die Frage nicht. Durch lapply() wird doch die Funktion auf die mehreren Dataframes in der Liste angewendet.
Die Liste der Dataframes habe ich ja mit meinem Code ebenfalls hinbekommen. Dort sind die Werte durch 10 geteilt. Aber es geht darum, dass ich keine Liste möchte, da ich über 6000 Dataframes habe, die unterschiedlich lang, groß und kompliziert sind; ich würde sie sehr ungerne miteinander kombinieren. Ich möchte nur ein paar Funktionen auf alle gleichzeitig anwenden. Zum Beispiel alle durch eine Zahl teilen.
Auch hier habe ich ein Verständnisproblem, weil ich mir nicht vorstellen kann, dass jemand 6000 Dataframes erzeugt, indem er sie per Hand eintippt.
Bitte zeig uns, wie diese 6000 Dataframes erzeugt werden.
Ich vermute, dann sehen wir auch, was Du bei Deiner Datenstruktur konzeptionell falsch machst. (Neben dem, dass Du höchstwahrscheinlich eine der bösen Funktionen, die mit a anfangen, benutzt.)
Also wenn ich beispielsweise meine Liste aus 6000 Dataframes schreibe und dann meine Funktion mit df_list_10 <- lapply(df_list, function(x) { x$col <- x$col/10; return(x) }) durchführe, dann muss ich als weiteren Schritt 6000 Codes einzeln schreiben, um meine ursprüglichen 6000 Dataframes mit den neuen Werten zu erhalen? Also so?

Code: Alles auswählen

...
df15_neu <- df_list_10[[15]]
...
5984 Codes später
...
df6000_neu <- df_list_10[[6000]]
Ganz klar, nein. Wenn es zwangsweise so wäre, hätte ich vor 15 Jahren R ganz schnell in irgendeine Ecke geschmissen und wäre bei octave geblieben.
Geht sowas kürzer?
Selbstverständlich - aber wenn wir nicht wissen, was Du da treibst und wo die Reise hingehen soll, versagt auch die beste Glaskugel :!:

Gruß, Jörg
Antworten