for Schleife über 2 Indixes

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

Moderatoren: EDi, jogo

Antworten
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

for Schleife über 2 Indixes

Beitrag von jessi »

Hallo zusammen,

meine Variable (Liste) vv enthält insgesamt 52 Vektoren, die jedoch unterschiedlich lange sind.

Code: Alles auswählen

str(vv)
List of 52
 $ : num [1:35463] 200 14 14 200 200 200 200 200 200 200 ...
 $ : num [1:10427] 200 200 200 200 200 200 200 200 200 150 ...
 $ : num [1:98855] 110 110 110 110 120 50 110 120 110 120 ...
 $ : num [1:48965] 150 150 20 20 50 20 14 20 20 20 ...
 $ : num [1:99769] 70 150 14 14 50 90 14 14 100 150 ...
 $ : num [1:14611] 70 70 70 70 70 70 70 70 70 70 ...
 $ : num [1:30541] 150 150 50 150 50 50 150 50 50 50 ...
 $ : num [1:62746] 20 20 100 100 20 14 14 140 20 14 ...
 $ : num [1:25387] 150 200 200 200 200 200 150 150 200 200 ...
 $ : num [1:30304] 20 100 100 100 100 70 100 100 100 100 ...
...


Dabei handelt es sich um Bundesstaaten und Länderklassen, die in dem jeweiligen Bundesstaat vorkommen. Jetzt möchte ich den einzelnen Vektoren die Bundesstaaten zuordnen, um besser verifizieren zu können.

Wenn ich das separat machen

Code: Alles auswählen

bs1 <- data.frame(vv[1], bs[1], id[1])
colnames(bs1) <- c("Klassen", "Staat", "ID")
str(bs1)
'data.frame':   35463 obs. of  3 variables:
 $ "Klasse"   200..200..200..200..200..14..150..150..: num  200 14 14 200 200 200 200 200 200 200 ...
 $ "Staat"                                                                 : Factor w/ 1 level "Ohio": 1 1 1 1 1 1 1 1 1 1 ...
 $ "ID"                                                                      : Factor w/ 1 level "34": 1 1 1 1 1 1 1 1 1 1 ...
Jetzt wäre es aber toll, wenn ich die obigen Zeilen nicht 52 mal kopieren muss, sondern eine Schleife darüber bauen. Mein Ansatz, allerdings nur für einen Index

Code: Alles auswählen

output <- character(0)
for (i in 1:52){ output <- c(output, data.frame(vv[i], bs[i], id[i])) }
Als Output bekomme ich dann eine Liste mit 156 Elementen

Code: Alles auswählen

List of 156
 $ "Klasse" 200..200..200..200..200..14..150..150.. : num [1:35463] 200 14 14 200 200 200 200 200 200 200 ...
$ "Staat"                                                                 : Factor w/ 1 level "Ohio": 1 1 1 1 1 1 1 1 1 1 ...
 $ "ID"                                                                      : Factor w/ 1 level "34": 1 1 1 1 1 1 1 1 1 1 ...
 $ "Klasse" 200..200..200..200..200..150..150..150..   : num [1:10427] 200 200 200 200 200 200 200 200 200 150 ...
 $ "Staat"                                                                 : Factor w/ 1 level "NY": 1 1 1 1 1 1 1 1 1 1 ...
 $ "ID"                                                                      : Factor w/ 1 level "12": 1 1 1 1 1 1 1 1 1 1 ...
...
Wie baue ich denn hier den zweiten Index (3) ein, damit ich am Ende 52x

Code: Alles auswählen

'data.frame':   35463 obs. of  3 variables:
 $ "Klasse"   200..200..200..200..200..14..150..150..: num  200 14 14 200 200 200 200 200 200 200 ...
 $ "Staat"                                                                 : Factor w/ 1 level "Ohio": 1 1 1 1 1 1 1 1 1 1 ...
 $ "ID"                                                                      : Factor w/ 1 level "34": 1 1 1 1 1 1 1 1 1 1 ...
 'data.frame': 10427 obs. of  3 variables: 
$ "Klasse" 200..200..200..200..200..150..150..150..   : num [1:10427] 200 200 200 200 200 200 200 200 200 150 ...
 $ "Staat"                                                                 : Factor w/ 1 level "NY": 1 1 1 1 1 1 1 1 1 1 ...
 $ "ID"                                                                      : Factor w/ 1 level "12": 1 1 1 1 1 1 1 1 1 1 ...
bekomme? Oder brauche ich überhaupt eine Variable mit 52x[Variabler Werte]x3 :shock:

Danke für eure Unterstützung.
Grüße, Jessi
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: for Schleife über 2 Indixes

Beitrag von jogo »

Hallo Jessi,

mapply() kann das für Dich erledigen. Es gibt auch noch einen Wrapper: Map()
Das könnte dann so aussehen:

Code: Alles auswählen

makedf <- function(vvi, bsi, idi) data.frame(Klassen=vvi, Staat=as.character(bsi), ID=as.character(idi), stringsAsFactors=FALSE)
L <- mapply(FUN=makedf, vv, bs, id)
Oder wolltest Du alles in einem Dataframe haben?

Code: Alles auswählen

data.frame(Klassen=unlist(vv), Staat=rep(bs, lengths(vv)), ID=rep(id, lengths(vv)))
Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: for Schleife über 2 Indixes

Beitrag von jessi »

Hallo Jörg,

das klappt prima. Vielen vielen Dank!!!

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

Re: for Schleife über 2 Indixes

Beitrag von jogo »

Hallo Jessi,

welche der beiden Varianten hast Du denn genommen?

Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: for Schleife über 2 Indixes

Beitrag von jessi »

Hallo Jörg,

die erste Version habe ich genommen.
Wenn man die Zeilen dann sieht, ist alles immer so logisch und nachvollziehbar, nur komme ich leider meist nicht selbst drauf. Ich glaube ja, dass ich dafür viel zu kompliziert denke, und die Lösung ja meist viel einfacher ist. Aber ich bleibe am R Programmen dran und irgendwann wird mir dann schon mal der Knopf aufgehen :lol:

Danke nochmals :D

Jessi
Antworten