Ich bin neu in R (Economist mit Hintergrund in Stata) und ich habe Probleme, eine geschachtelte for-Schleife für mich arbeiten zu lassen. Ich weiß, das Problem ist, dass ich kein gutes Verständnis davon habe, wie man den Schleifenzähler als Teil eines Variablennamens verwendet.Erstellen neuer Spalten mit einer for-Schleife
Ein bisschen Hintergrund. Ich habe Datenrahmen mit Daten über durchschnittliche Mietpreise für Häuser unterschiedlicher Größe (1 Schlafzimmer, 2 Schlafzimmer, etc) und Daten zum Jahreseinkommen (Mittelwert, Median und verschiedene Perzentile). Ich versuche, eine Reihe neuer Spalten zu erzeugen, die das Verhältnis dieser beiden Dinge (Mietpreis/Durchschnittseinkommen) enthalten.
Insbesondere meine Variablen sind:
beds1, beds2, beds3, beds4
mean, median, p10, p25, p75, p90
Sie sehen also, ich 24 neue Spalten der Kosten/Ertragsdaten erzeugen müssen. Ich könnte 24 Zeilen Code schreiben, aber ich will nicht. Noch wichtiger ist, ich möchte eine effiziente Art und Weise lernen, dies in R zu tun. In Stata könnte ich dies sehr einfach mit einer verschachtelten for-Schleife tun, aber ich kann es nicht in R arbeiten. Hier ist mein Code so weit.
for (i in 1:4) {
stat <- c("median", "mean", "p10", "p25", "p75","p90")
for (x in stat) {
df$beds[i]_[x] <- round((df$beds[i]/df$[x]),digits=3)
}
}
Wenn ich diesen Code ausführen die Fehler, die ich bekommen ist
Error: unexpected input in:
" for (x in stat) {
df$beds[i]_"
> }
Error: unexpected '}' in " }"
> }
Error: unexpected '}' in "}"
ich versucht habe [[]]
die doppelte eckige Klammern zu verwenden, aber das hat nicht die Ergebnisse ändern. Wenn jemand etwas darüber weiß, warum die Namen der dynamischen Variablen nicht funktionieren, lassen Sie es mich bitte wissen. Noch besser, da ich glaube, dass Schleifen in R böse sind, wenn jemand einen Weg kennt, um dies zu tun, würde ich das auch gern hören.
EDIT
Dank @Spacedman für den Kommentar. Ich denke, ich verstehe, was du sagst. Bedeutet das also, dass es einfach nicht zu tun ist, was ich in R machen will?
var1 <- c("beds1", "beds2")
var2 <- c("mean", "median")
for (i in 1:2) {
for (j in 1:2) {
df$var1[i]_var2[j] <- df$var1[i]/df$var2[j]
}
}
Ich denke, das var1
und var2
die Elemente der Listen greifen sollte, so dass, wenn i=1
und j=1
, df$var1[i]/df$var2[j]
df$beds1/df$mean
bedeuten sollte. Oder würde R verrückt werden und denken, dass ich versuche, Streicher zu teilen?
FINAL EDIT MIT ANTWORT VON @SPACEEMAN
Dank @Spacedman. Ich habe deinen Spoiler geliebt und danke, dass du zusätzliche Hilfe geleistet hast. Ich habe den Unterschied zwischen den beiden Arten, nach dem letzten Beitrag auf die Spalten zu verweisen, nicht ganz verstanden, aber ich denke, ich habe jetzt eine bessere Idee. Ich habe ein bisschen optimiert und jetzt habe ich etwas, das perfekt funktioniert. Danke noch einmal!
beds <- c("beds1", "beds2", "beds3", "beds4")
stat <- c("median", "mean", "p10", "p25", "p75","p90")
for(i in beds){
for(x in stat){
res = paste0(i,"_",x)
df[[res]]=round(df[[i]]/df[[x]],digits=3)
}
}
bearbeiten. Kommentar zur Frage verschoben, weil die Formatierung nicht funktioniert hat. – JMac