Seite 1 von 1
Datensatz mit for-Schleife erstellen
Verfasst: Mi Jun 27, 2018 7:39 pm
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!
Re: Datensatz mit for-Schleife erstellen
Verfasst: Do Jun 28, 2018 2:35 pm
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
Re: Datensatz mit for-Schleife erstellen
Verfasst: Fr Jun 29, 2018 8:09 pm
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
Re: Datensatz mit for-Schleife erstellen
Verfasst: Fr Jun 29, 2018 8:49 pm
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
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
Re: Datensatz mit for-Schleife erstellen
Verfasst: Sa Jun 30, 2018 3:01 pm
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
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
Re: Datensatz mit for-Schleife erstellen
Verfasst: Sa Jun 30, 2018 7:30 pm
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
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
Re: Datensatz mit for-Schleife erstellen
Verfasst: So Jul 01, 2018 2:58 am
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
Re: Datensatz mit for-Schleife erstellen
Verfasst: So Jul 01, 2018 5:13 am
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