Datensatz mit for-Schleife erstellen

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

Moderatoren: EDi, jogo

Antworten
Alex_neu3
Beiträge: 6
Registriert: Mo Apr 09, 2018 8:35 pm

Datensatz mit for-Schleife erstellen

Beitrag von Alex_neu3 »

Hallo,

mein Problem mit R ist:
Ich habe eine Liste mit 500 Elementen. In jedem Element ist eine Matrix enthalten, die ich über liste[[1]]@matrix zugreifen kann. Ich würde jetzt gerne die einzelnen Matrizen seperat abspeichern (sie dann als einen Vektor auffassen und zu einem Datensatz zusammenfügen).

Mein Versuch wäre eine for-Schleife:

Code: Alles auswählen

 for(i in 1:500) {
      output <- rbind(output, data.frame(as.vector(liste[[i]]@matrix)))
                    }

Problem ist, dass er die Zahlen dann einfach aneinander reiht und nicht nach der ersten Matrix eine neue Spalte beginnt (bekomme also einen Datensatz mit nur einer Spalte). Hat jemand eine Idee, wie ich das in der for-Schleife definieren kann? Oder kann ich vorab festlegen, wie viele Zeilen/Spalten mein Datensatz haben soll, dass diese nur noch mit den einzelnen Zahlen gefüllt werden muss?

Schon mal vielen Dank für jede Hilfe!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datensatz mit for-Schleife erstellen

Beitrag von jogo »

Hallo Alex,

mit S4-Objekten habe ich sonst nichts zu tun. Deshalb muss ich meinen Ansatz als Frage formulieren.
Hilft Dir:

Code: Alles auswählen

output <- sapply(liste, function(x) data.frame(as.vector(x@matrix)))
Gruß, Jörg
Alex_neu3
Beiträge: 6
Registriert: Mo Apr 09, 2018 8:35 pm

Re: Datensatz mit for-Schleife erstellen

Beitrag von Alex_neu3 »

Hallo Jörg,

Danke für deine Antwort!
Mit sapply ist "output" jetzt eine Liste mit 500 Vektoren als Elementen. Das vereinfacht mein Problem auf jeden Fall schon mal.

Das Problem, dass nicht die einzelnen Vektoren die Spalten von einem Datensatz sind, bleibt aber.
Mit der Liste hätte ich jetzt wieder die for-Schleife probiert:

Code: Alles auswählen

 
for(i in 500) {
  daten  <-rbind(daten, data.frame(output[[i]]))
   }
Aber auch hier bekomme ich wieder eine Spalte mit allen Vektoren.

Ich habe mich an diesem Beispiel orientiert:
viewtopic.php?t=30

Code: Alles auswählen

 
input <- c("Anton", "Berta", "Cecilie", "Danton", "Erwin")

output <- data.frame(name = character(0), len=numeric(0))
for(name in input){
  output <- rbind(output, data.frame(toupper(name), nchar(name)))
}

print(output)
Bei diesem Beispiel werden alle Namen in eine Spalte gesteckt. Ich möchte jetzt aber die Namen in verschiedenen Spalten.
Hättest Du oder jemand anderes eine Idee, wie ich das in R umsetzen kann?

Viele Grüße,
Alex
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datensatz mit for-Schleife erstellen

Beitrag von jogo »

Hallo Alex,
Alex_neu3 hat geschrieben: Fr Jun 29, 2018 8:09 pm Mit sapply ist "output" jetzt eine Liste mit 500 Vektoren als Elementen. Das vereinfacht mein Problem auf jeden Fall schon mal.
o.k.
Dass das Ergebnis eine Liste ist, kann daran liegen, dass die Vektoren verschieden lang sind.
Wenn die Vektoren gleichlang sind, sollte sapply() eine Matrix als Ergebnis liefern.
Hast Du überprüft, ob die Vektoren gleichlang sind? Wenn ja, wie?
Bitte zeige uns die Ausgabe von

Code: Alles auswählen

summary(lapply(output, length))
Das Problem, dass nicht die einzelnen Vektoren die Spalten von einem Datensatz sind, bleibt aber.
Mit der Liste hätte ich jetzt wieder die for-Schleife probiert:

Code: Alles auswählen

 
for(i in 500) {
  daten  <-rbind(daten, data.frame(output[[i]]))
   }
Aber auch hier bekomme ich wieder eine Spalte mit allen Vektoren.
ohne Ausgangsdaten zum Ausprobieren, ist es sehr schwer, dies nachzuvollziehen.
- Du meinst hier sicherlich for (i in 1:500)
Ich habe mich an diesem Beispiel orientiert:
viewtopic.php?t=30

Code: Alles auswählen

 
input <- c("Anton", "Berta", "Cecilie", "Danton", "Erwin")

output <- data.frame(name = character(0), len=numeric(0))
for(name in input){
  output <- rbind(output, data.frame(toupper(name), nchar(name)))
}

print(output)
Bei diesem Beispiel werden alle Namen in eine Spalte gesteckt. Ich möchte jetzt aber die Namen in verschiedenen Spalten.
Hättest Du oder jemand anderes eine Idee, wie ich das in R umsetzen kann?
Bitte zeige uns, wie das Ergebnis aussehen soll für dieses Beispiel :!:

Gruß, Jörg
Alex_neu3
Beiträge: 6
Registriert: Mo Apr 09, 2018 8:35 pm

Re: Datensatz mit for-Schleife erstellen

Beitrag von Alex_neu3 »

Hallo Jörg,

Danke für deine Antwort!
Dass das Ergebnis eine Liste ist, kann daran liegen, dass die Vektoren verschieden lang sind.
Wenn die Vektoren gleichlang sind, sollte sapply() eine Matrix als Ergebnis liefern.
Hast Du überprüft, ob die Vektoren gleichlang sind? Wenn ja, wie?
Die Vektoren müssten gleichlang sein: In der Global Environment sind unter Output alle Elemente der Liste aufgelistet. Da steht bei allen:
as.vector.x..Data. int[1:5324]
Also müssten alles Vektoren der Länge 5324 sein.
Bitte zeige uns die Ausgabe von

Code: Alles auswählen

summary(lapply(output, length))

Code: Alles auswählen

                   Length Class  Mode   
as.vector.x..Data. 1      -none- numeric
as.vector.x..Data. 1      -none- numeric
as.vector.x..Data. 1      -none- numeric
(...)
- Du meinst hier sicherlich for (i in 1:500)
Ja, sollte for(i in 1:500) heißen. Danke!
Bitte zeige uns, wie das Ergebnis aussehen soll für dieses Beispiel :!:
Ich bekomme bei dem Beispiel als Ergebnis:

Code: Alles auswählen

  toupper.name. nchar.name.
1         ANTON           5
2         BERTA           5
3       CECILIE           7
4        DANTON           6
5         ERWIN           5
Ich möchte aber:

Code: Alles auswählen

   Name1  Name2 Name3  Name4  Name5
1 ANTON  BERTA CECILIE DANTON ERWIN
Nur das ich jeden Vektor anstatt den Namen in einer neuen Spalte haben möchte. Also wie ich definieren kann, dass beim Schreiben des Datensatz nach jedem Element der Liste(=Vektor) ein neue Spalte begonnen wird.

Viele Grüße,
Alex
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datensatz mit for-Schleife erstellen

Beitrag von jogo »

Hallo Alex,
Alex_neu3 hat geschrieben: Sa Jun 30, 2018 3:01 pm Die Vektoren müssten gleichlang sein: In der Global Environment sind unter Output alle Elemente der Liste aufgelistet. Da steht bei allen:
as.vector.x..Data. int[1:5324]
Also müssten alles Vektoren der Länge 5324 sein.
Bitte zeige uns die Ausgabe von

Code: Alles auswählen

summary(lapply(output, length))

Code: Alles auswählen

                   Length Class  Mode   
as.vector.x..Data. 1      -none- numeric
as.vector.x..Data. 1      -none- numeric
as.vector.x..Data. 1      -none- numeric
(...)
dies ist die Stelle, an der ich ohne Originaldaten oder Daten, die den Originaldaten entsprechen (siehe viewtopic.php?f=20&t=11 oder aushilfsweise https://stackoverflow.com/questions/596 ... le-example ) nicht weiter komme. Offensichtlich ist Deine Datenstruktur anders/komplizierter als Du sie bisher beschrieben hast.
Den Beweis dafür hast Du jetzt selbst geliefert:
einerseits schreibst Du: Also müssten alles Vektoren der Länge 5324 sein.
andererseits liefert lenght() für alle Elemente den Wert 1.

Gruß, Jörg
Alex_neu3
Beiträge: 6
Registriert: Mo Apr 09, 2018 8:35 pm

Re: Datensatz mit for-Schleife erstellen

Beitrag von Alex_neu3 »

Hallo Jörg,

ich denke, dass mein Problem viel einfacher war als ich es wohl beschrieben habe. Habe aber jetzt meinen Fehler gefunden:

Meine Ausgangssituation war eine Liste mit Vektoren.

Code: Alles auswählen

x <- rnorm(10)
y <- rnorm(10)
z <- rnorm(10)

a <- list(x,y,z)
Mit meiner for-Schleife:

Code: Alles auswählen

for(i in 1:3) {
  beispiel  <-rbind(beispiel, data.frame(a[[i]]))
}
Hab ich dann eine Spalte mit 30 Zeilen,

Wenn ich aber die for-Schleife ändere:

Code: Alles auswählen

beispiel <- data.frame(1:10)
for(i in 1:3) {
  beispiel <- data.frame(beispiel, a[[i]])
}
Bekomme ich meine gewünschten 3 Spalten mit je 10 Zeilen. Was mich noch verwirrt hat, war, dass ich jetzt hier "Beispiel" vorab definieren muss, weil ich sonst die Fehlermeldung bekomme:
Error in data.frame(beispiel, a[]) : object 'beispiel' not found

Habe dann halt noch eine unnötige Spalte am Anfang, hier mit den Werten 1:10. Kann ich natürlich löschen, aber gibt es eine elegantere Lösung als die Spalte erst zu erschaffen und anschließend zu löschen?

Vielen Dank für deine Hilfe! Wäre sonst nicht auf die Lösung gekommen..

Viele Grüße,
Alex
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datensatz mit for-Schleife erstellen

Beitrag von jogo »

Hallo Alex,

hier noch zwei Varianten für Dein Beispiel:

Code: Alles auswählen

x <- rnorm(10)
y <- rnorm(10)
z <- rnorm(10)

a <- list(x,y,z)

as.data.frame(a)
matrix(unlist(a), nrow = length(a[[1]]))
Bei as.data.frame() sind die Spaltennamen nicht so schön: hier wäre es besser, wenn die Vektoren in der Liste a Namen hätten. Ober man konstruiert die Namen beim Aufruf von as.data.frame():

Code: Alles auswählen

as.data.frame(a, col.names = paste0("X", 1:length(a)))
Bei der Variante mit matrix(unlist(a), ...) entsteht als Ergebnis natürlich eine Matrix.

Ansonsten hätte man auch cbind() verwenden können:

Code: Alles auswählen

beispiel <- a[[1]]
for (i in 2:length(a)) beispiel <- cbind(beispiel, a[[i]])
beispiel
Gruß, Jörg
Antworten