Problem mit Listen

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

Moderatoren: EDi, jogo

mrzlatan91

Problem mit Listen

Beitrag 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
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Problem mit Listen

Beitrag von jogo »

Hallo mrzlatan91,

willkommen im Forum.
Dein lapply()-Aufruf ist zu kompliziert:

Code: Alles auswählen

lapply(1:nrow(df), function(x) df[x,])
Was Du mit der restlichen Konstruktion bezwecken willst, ist mir unklar.

Gruß, Jörg
mrzlatan91

Re: Problem mit Listen

Beitrag 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
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Problem mit Listen

Beitrag 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).
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Problem mit Listen

Beitrag 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:

Code: Alles auswählen

df$gruppe <- c(1,1, 2)
Diese Spalte kannst Du dann nutzen, um den Dataframe in die entsprechenden Stücke zu zerhacken:

Code: Alles auswählen

split(df, df$gruppe)
:?:
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
mrzlatan91

Re: Problem mit Listen

Beitrag 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.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Problem mit Listen

Beitrag 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
bigben
Beiträge: 2778
Registriert: Mi Okt 12, 2016 9:09 am

Re: Problem mit Listen

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
mrzlatan91

Re: Problem mit Listen

Beitrag 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?
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Problem mit Listen

Beitrag 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:

Code: Alles auswählen

?split
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

Code: Alles auswählen

gruppe <- rep(1:3, c(499, 700-500, nrow(df)-699))
oder

Code: Alles auswählen

gruppe <- rep(1:3, diff(c(1, 500, 700, 1+nrow(df))))
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
Antworten