Seite 1 von 2
Problem mit Listen
Verfasst: Mo Jun 19, 2017 8:52 pm
von mrzlatan91
Liebe Community,
ich sitze aktuell an einem Problem bei der Erstellung einer Liste. Genau genommen möchte ich aus einem Data.Frame eine Liste erstellen um später mit
[] und $ arbeiten zu können
. Es geht dabei um folgendes Beispiel:
Angenommen wir erzeugen das folgende Data.Frame
Code: Alles auswählen
> df = data.frame(x=c('a','b','c'), y=3:1)
> df
x y
1 a 3
2 b 2
3 c 1
Dann kann ich mit
Code: Alles auswählen
ldf = lapply(as.list(1:dim(df)[1]), function(x) df[x[1],])
eine Liste aus dem data.frame erzeugen.
Die Eingabe
ldf[[2]]$y [2] liefert mir jetzt beispielsweise das folgende Ergebnis:
[1] 2
Ich möchte aber nicht, dass jede Zeile i aus dem Data-Frame zu einem Listen-Element
ldf [ [ i ] ] wird, sondern dass beispielsweise die ersten beiden Zeilen ein Listenelement werden und die 3. Zeile das zweite.
Damit wären dann beispielsweise folgende Abfragen möglich:
ldf [ [ 1 ] ] $ x [ 1 ] = a und
ldf[ [ 1 ] ] $x [ 2 ] = b und
ldf[ [ 2 ] ] $x[ 1 ] = c liefert.
Ich hoffe ich konnte mich halbwegs deutlich ausdrücken, es ist leider sehr schwierig mein Problem in Worte zu fassen.
Vielen Dank für Eure Hilfe im Voraus
Re: Problem mit Listen
Verfasst: Mo Jun 19, 2017 10:32 pm
von jogo
Hallo mrzlatan91,
willkommen im Forum.
Dein lapply()-Aufruf ist zu kompliziert:
Was Du mit der restlichen Konstruktion bezwecken willst, ist mir unklar.
Gruß, Jörg
Re: Problem mit Listen
Verfasst: Mo Jun 19, 2017 10:53 pm
von mrzlatan91
Hallo Jörg,
vielen Dank für deine Antwort.
Dein Code bezweckt das gleiche wie mein Code.
Mit dem aktuellen Code wird jede Zeile aus dem Data Frame zu einem Listen-Objekt.
Also wenn wir beispielsweise 3 Zeilen im Dataframe haben führt das zu einer Liste
mit den Objekten ldf[[1]], ldf[[2]] und ldf[[3]].
Ich würde diese jedoch gerne beliebig gruppieren, also beispielsweise die ersten beiden Zeilen
x y
1 a 3
2 b 2
zu einem Listen-objekt machen, sodass ich später wie folgt zugreifen kann:
ldf[[1]]$x[1] = a
ldf[[1]]$x[2] = b
ldf[[1]]$y[1] = 3
ldf[[1]]$y[2] = 2
Re: Problem mit Listen
Verfasst: Di Jun 20, 2017 6:41 am
von EDi
Die Sinnhaftigkeit erschließt sich mir leider auch nicht
Du willst den data.frame nur in eine Liste packen...
Code: Alles auswählen
df = data.frame(x=c('a','b','c'), y=3:1)
ldf <- list(df)
ldf[[1]]
ldf[[1]]$x[1]
ldf[[1]]$x[2]
BTW: ein data.frame ist auch nur eine Liste (mit gleichlangen Vektoren als Elemente).
Re: Problem mit Listen
Verfasst: Di Jun 20, 2017 8:20 am
von jogo
Hallo mrzlatan91,
mrzlatan91 hat geschrieben: Mo Jun 19, 2017 10:53 pm
Also wenn wir beispielsweise 3 Zeilen im Dataframe haben führt das zu einer Liste
mit den Objekten ldf[[1]], ldf[[2]] und ldf[[3]].
Ich würde diese jedoch gerne beliebig gruppieren, also beispielsweise die ersten beiden Zeilen
x y
1 a 3
2 b 2
zu einem Listen-objekt machen, sodass ich später wie folgt zugreifen kann:
ldf[[1]]$x[1] = a
ldf[[1]]$x[2] = b
ldf[[1]]$y[1] = 3
ldf[[1]]$y[2] = 2
dass Du dies so machen möchtest, habe ich sehr wohl verstanden. Allerdings kann ich immer noch nicht sehen, wozu das gut sein soll.
Warum spendierst Du in Deinem ursprünglichen Dataframe
df nicht einfach eine neue Spalte für die Gruppierung:
Diese Spalte kannst Du dann nutzen, um den Dataframe in die entsprechenden Stücke zu zerhacken:
Alles zusammen würde es so aussehen:
Code: Alles auswählen
df = data.frame(x=c('a','b','c'), y=3:1, stringsAsFactors = FALSE)
ldf <- split(df, c(1,1,2)) # Dataframe zerhacken
ldf[[1]]$x[1]
ldf[[1]]$x[2]
ldf[[2]]$x[1]
Gruß, Jörg
Re: Problem mit Listen
Verfasst: Di Jun 20, 2017 9:58 am
von mrzlatan91
Vielen Dank für eure Antworten.
wie ihr richtigerweise festgestellt habt, hat das ganze relativ wenig Sinn. Das Beispiel bestand natürlich nur aus Muster-Daten.
Ich habe an der Uni Aktien-Daten gezogen, die jetzt in dem besagten Dataframe vorliegen. Jetzt muss ich eine Auswertung machen für diese Aktien.
Eine ähnliche Auswertung habe ich jedoch schonmal im Rahmen meiner Abschlussarbeit gemacht und davon habe ich noch das Programm. Damals lagen die Daten jedoch wie bereits erwähnt in Listen vor, wobei jede Aktie einer Liste entspricht und dann die jeweiligen Spalten vorhanden sind (Datum, Kurs, etc.).
Das heißt für mich: wenn ich das Data-Frame in genau das selbe Format bekomme, kann ich mir einen Haufen Arbeit sparen.
Re: Problem mit Listen
Verfasst: Di Jun 20, 2017 10:27 am
von jogo
Also, wenn ich so mein abschließendes Beispiel
Code: Alles auswählen
df = data.frame(x=c('a','b','c'), y=3:1, stringsAsFactors = FALSE)
ldf <- split(df, c(1,1,2)) # Dataframe zerhacken
ldf[[1]]$x[1]
ldf[[1]]$x[2]
ldf[[2]]$x[1]
mit der von Dir gewünschten Form des Zugriffs
Damit wären dann beispielsweise folgende Abfragen möglich:
ldf [ [ 1 ] ] $ x [ 1 ] = a und ldf[ [ 1 ] ] $x [ 2 ] = b und ldf[ [ 2 ] ] $x[ 1 ] = c liefert.
vergleiche, stelle ich fest, dass beides Identisch ist ...
Gruß, Jörg
Re: Problem mit Listen
Verfasst: Di Jun 20, 2017 11:06 am
von bigben
Hallo mrzlatan91,
ich glaube, mit den Aktien wird es verständlicher. Trotzdem habe ich es noch nicht verstanden. Vielleicht beschreibst Du mal die Daten, wie sie jetzt vorliegen (eenn der Dataframe mit allen Daten `aktien` heißt, würden die Ausgaben von `str(aktien)` und von `head(aktien)` wahrscheinlich sehr helfen). Und dann beschreib nochmal, wie die Ergebnisse aussehen sollen (am Beispiel).
Momentan hast Du geschrieben, dass Du weißt, wie man einen Dataframe in seine Zeilen zerlegt und aus jeder Zeile eine Liste macht und dass Du deren Reihenfolge irgendwie ändern willst. Was genau Du da an welcher Reihenfolge ändern willst, habe ich noch nicht verstanden. Vielleicht hilft ein konkreteres Beispiel.
LG,
Bernhard
Re: Problem mit Listen
Verfasst: Di Jun 20, 2017 8:13 pm
von mrzlatan91
jogo hat geschrieben: Di Jun 20, 2017 10:27 am
Also, wenn ich so mein abschließendes Beispiel
Code: Alles auswählen
df = data.frame(x=c('a','b','c'), y=3:1, stringsAsFactors = FALSE)
ldf <- split(df, c(1,1,2)) # Dataframe zerhacken
ldf[[1]]$x[1]
ldf[[1]]$x[2]
ldf[[2]]$x[1]
mit der von Dir gewünschten Form des Zugriffs
Damit wären dann beispielsweise folgende Abfragen möglich:
ldf [ [ 1 ] ] $ x [ 1 ] = a und ldf[ [ 1 ] ] $x [ 2 ] = b und ldf[ [ 2 ] ] $x[ 1 ] = c liefert.
vergleiche, stelle ich fest, dass beides Identisch ist ...
Gruß, Jörg
Hi Jörg, ja das stimmt. Vielen vielen Dank. Mir ist nur nicht ganz klar, wieso du die Zerhackung mit c(1,1,2) machst. Kannst du mir vielleicht noch kurz erklären wie das zu stande kommt?
In meinem realen Data-Frame df habe ich beispielsweise eine Spalte Date. Jetzt ist es so, dass z.B. ab
df$date[500] Aktie 2 beginnt und ab df$date[700] Aktie 3. Könntest du mir sagen wie dann mein Vektor c( , , , ) aussieht beim Split-befehl?
Re: Problem mit Listen
Verfasst: Di Jun 20, 2017 9:02 pm
von jogo
mrzlatan91 hat geschrieben: Di Jun 20, 2017 8:13 pm
Hi Jörg, ja das stimmt. Vielen vielen Dank. Mir ist nur nicht ganz klar, wieso du die Zerhackung mit c(1,1,2) machst. Kannst du mir vielleicht noch kurz erklären wie das zu stande kommt?
alle Zeilen mit dem gleichen Wert im Gruppierungsvektor gehören zusammen in einen Teildataframe (subset). Dies und den Rest erklärt der Hilfetext:
In meinem realen Data-Frame df habe ich beispielsweise eine Spalte Date. Jetzt ist es so, dass z.B. ab
df$date[500] Aktie 2 beginnt und ab df$date[700] Aktie 3. Könntest du mir sagen wie dann mein Vektor c( , , , ) aussieht beim Split-befehl?
da gibt es wie immer verschiedene Möglichkeiten:
Code: Alles auswählen
gruppe <- numeric(nrow(df))
gruppe[1:499] <- 1
gruppe[500:699] <- 2
gruppe[700:nrow(df)] <- 3
oder
oder
Noch schöner wäre es, wenn Dein Dataframe eine Spalte mit dem Namen der Aktie hat: dann könntest Du gleich diese Spalte verwenden, um die Gruppierung zu definieren.
Gruß, Jörg