Dynamische Variablen mit Schleife

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

Moderatoren: EDi, jogo

wkowalski

Dynamische Variablen mit Schleife

Beitrag von wkowalski »

Hallo!

Ich sitze gerade an einer Aufgabe an der ich mir zurzeit die Zähne ausbeiße:

Ziel ist es eine Excel-Datei einzulesen und mit den darin befindlichen Daten Berechnungen durchzuführen.

Hier ein Beispiel der Excel-Datei um sich das besser Vorstellen zu können:

Jahr Daten_0 Daten_1 Daten_2 Daten_3 Daten_4
1989 0,003023015 0,000652742 0,00042304 0,000461802 0,000630476
1990 0,002927452 0,000653723 0,000844688 0,000814171 0,000501122
1991 0,002297123 0,000544034 0,000600304 0,001182525 0,000738104
1992 0,002815327 0,000927038 0,000363535 0,000652673 0,000818031
1993 0,002763109 0,001038739 0,000561097 0,000547784 0,000602898
1994 0,002838143 0,000935872 0,000485496 0,000557483 0,00054448
1995 0,003664018 0,000867124 0,000690552 0,000564596 0,000639426
1996 0,003178668 0,000804148 0,000679026 0,000627238 0,000661973
1997 0,004350883 0,001057385 0,000592129 0,000555007 0,000545907
1998 0,003850793 0,000658921 0,000638541 0,000486309 0,000514097

Nun lese ich diese Datei mit dem Befehl ein

Code: Alles auswählen

data <- read.csv("kh_kreislauf_m_test.csv",header = T,sep=";",dec=",")
was auch wunderbar funktioniert.

Nun zu meiner Frage: Wenn ich eine Spalte des eingelesenen Datensatzes in eine Variable speichern möchte kann ich das über

Code: Alles auswählen

Jahr <- data$Jahr
machen.
Wenn die Excelfile aber 95 Spalten (so wie in meinem Fall) hat statt den obigen 6 wäre es ziemlich umständlich jede Spalte einzeln einzulesen. Daher bin ich auf der Suche nach einer eleganten Lösung,
die mir meinen Variablennamen an die jeweilige Spalte anpasst und deren Werte speichert. Am Ende hätte ich gerne 6 Variablen, welche die Daten der einzelnen Spalten beinhaltet.
Kann man das mit einer for-Schleife lösen? Wie passe ich den Index der Variablen an, damit nach jedem Durchlauf der Schleife eine neue entsprechende Variable angelegt wird?

Hilfe! :o
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Dynamische Variablen mit Schleife

Beitrag von jogo »

Hallo wkowalski,

willkommen im Forum!
wkowalski hat geschrieben: Nun lese ich diese Datei mit dem Befehl ein

Code: Alles auswählen

data <- read.csv("kh_kreislauf_m_test.csv",header = T,sep=";",dec=",")
was auch wunderbar funktioniert.
prima. Bitte kontrolliere mit

Code: Alles auswählen

str(data)
ob auch wirklich alles gut funktioniert hat.
Nun zu meiner Frage: Wenn ich eine Spalte des eingelesenen Datensatzes in eine Variable speichern möchte kann ich das über

Code: Alles auswählen

Jahr <- data$Jahr
machen.
Wenn die Excelfile aber 95 Spalten (so wie in meinem Fall) hat statt den obigen 6 wäre es ziemlich umständlich jede Spalte einzeln einzulesen. Daher bin ich auf der Suche nach einer eleganten Lösung,
die mir meinen Variablennamen an die jeweilige Spalte anpasst und deren Werte speichert. Am Ende hätte ich gerne 6 Variablen, welche die Daten der einzelnen Spalten beinhaltet.
Kann man das mit einer for-Schleife lösen? Wie passe ich den Index der Variablen an, damit nach jedem Durchlauf der Schleife eine neue entsprechende Variable angelegt wird?
Die elegente Lösung ist, keine neuen Variablen anzulegen. :shock:
Bitte beschreibe, was Du mit den Objekten anstellen möchtest! (Ich kann mir nicht vorstellen, dass das Anlegen von neuen Objekten Dein einziges Ziel ist. ;) )

Gruß, Jörg
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

Nun ja, ich will für jede Spalte eine Hochrechnung machen (mit linearer Regression) und anschließend die neuen Werte wieder in eine Excel Datei schreiben. Diese Hochrechnung soll vom Ende des Datensatzes (Jahr 1998) bis zu einem bestimmten Jahr, z.B. 2010 durchgeführt werden.

Der Datensatz soll nach der Berechnung in etwa so aussehen:

Jahr Daten_0 Daten_1 Daten_2 Daten_3 Daten_4
...
1993 0,002763109 0,001038739 0,000561097 0,000547784 0,000602898
1994 0,002838143 0,000935872 0,000485496 0,000557483 0,00054448
1995 0,003664018 0,000867124 0,000690552 0,000564596 0,000639426
1996 0,003178668 0,000804148 0,000679026 0,000627238 0,000661973
1997 0,004350883 0,001057385 0,000592129 0,000555007 0,000545907
1998 0,003850793 0,000658921 0,000638541 0,000486309 0,000514097
1999 0,003664445 0,000778767 0,000638541 0,000486309 0,000514097
2000 0,003664445 0,000778767 0,000638541 0,000486309 0,000514097
2001 0,003664445 0,000778767 0,000638541 0,000486309 0,000514097
2002 0,003664445 0,000778767 0,000638541 0,000486309 0,000514097
2003 0,003664445 0,000778767 0,000638541 0,000486309 0,000514097

...

wobei der grün markierte Bereich den hochgerechneten Teil darstellt, welcher anschließend, zusammen mit den ursprünglichen Daten in eine neue Excel-Datei geschrieben werden soll.

So ein lineares Modell benötigt meines Wissens nach 2 Elemente:

Code: Alles auswählen

linModel <- lm(Daten_0 ~ Jahr)
wobei Jahr hier die erste Spalte darstellt (Jahr <- data$Jahr) und Daten_0 die zweite Spalte (Daten_0 <- data$Daten_0). Analog soll diese Berechnung für alle Spalten wiederholt werden. Nun habe ich in meiner Excel Datei aber 95 Spalten und will das nicht für jede Spalte einzeln berechnen müssen (und ich bin mir ziemlich sicher, dass man das auch nicht machen muss - ich weiß leider nur nicht wie).

LG
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Dynamische Variablen mit Schleife

Beitrag von jogo »

Hallo  wkowalski,

wenn ich Dich richtig verstanden habe, könnte folgender Code das Grundgerüst sein:

Code: Alles auswählen

d <- iris
lapply(d[-(4:5)], function(x) lm(x ~ d$Petal.Width))
- hier fehlt natürlich noch der predict-Teil (Du hast es Hochrechnung genannt). Wenn man die gesamte Aufgabe für eine Spalte definiert und in die Funktion packt, kann man diese Funktion auf alle entsprechenden Spalten anwenden.
Kannst Du uns Daten liefern (siehe viewtopic.php?f=20&t=11 ) ? ... also z.B. das Ergebnis von:

Code: Alles auswählen

dput(data[, c("Jahr", "Daten_0")])
Gruß, Jörg
p.s.:
Ich habe gesehen, dass Du diese Frage auch in einem anderen Forum gestellt hast. Dagegen ist generell nichts einzuwenden, aber spätestens jetzt solltest Du in dem anderen Forum darauf verweisen, dass hier bereits Antworten geschrieben wurden :!:
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

O.k. habe jetzt im anderen Forum bescheid gegeben, dass ich hier gut beraten werde ;)

Der Befehl

Code: Alles auswählen

dput(data[, c("Jahr", "X0")]
(sry meine Spalten sind von X0-X6 nummeriert) liefert:

Code: Alles auswählen

structure(list(Jahr = 1989:2014, X0 = c(0.003023015, 0.002927452, 
0.002297123, 0.002815327, 0.002763109, 0.002838143, 0.003664018, 
0.003178668, 0.004350883, 0.003850793, 0.003509275, 0.003250701, 
0.003345808, 0.00308408, 0.002670496, 0.003213876, 0.002821363, 
0.002765209, 0.002883229, 0.003257329, 0.002789505, 0.002373275, 
0.002696899, 0.002846016, 0.002207287, 0.002817528)), .Names = c("Jahr", 
"X0"), class = "data.frame", row.names = c(NA, -26L))
Was hat es mit diesem "iris" auf sich? Das verstehe ich leider nicht so ganz obwohl ich mir gerade die Hilfe dazu angesehen habe --> da gehts irgendwie um Blumen verschiedener Spezies mit verschiedenen Eigenschaften.

lapply führt eine Funktion über eine Liste oder einen Vektor aus --> das klingt schon mal recht vielversprechend.

LG
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Dynamische Variablen mit Schleife

Beitrag von jogo »

wkowalski hat geschrieben: Di Sep 05, 2017 10:57 am O.k. habe jetzt im anderen Forum bescheid gegeben, dass ich hier gut beraten werde ;)
ok
Was hat es mit diesem "iris" auf sich? Das verstehe ich leider nicht so ganz obwohl ich mir gerade die Hilfe dazu angesehen habe --> da gehts irgendwie um Blumen verschiedener Spezies mit verschiedenen Eigenschaften.
R bringt etliche Beispieldatensätze mit.
Worin dieser Deinen Daten gleicht: es gibt mehrere numerische Spalten;
(thematisch geht es um etwas völlig anderes) wenn man keine Beispieldaten hat - R hat welche.

Code: Alles auswählen

data()
lapply führt eine Funktion über eine Liste oder einen Vektor aus --> das klingt schon mal recht vielversprechend.
so ist es. 8-)

So etwa könnte es aussehen:

Code: Alles auswählen

data <- structure(list(Jahr = 1989:2014, X0 = c(0.003023015, 0.002927452, 
                                        0.002297123, 0.002815327, 0.002763109, 0.002838143, 0.003664018, 
                                        0.003178668, 0.004350883, 0.003850793, 0.003509275, 0.003250701, 
                                        0.003345808, 0.00308408, 0.002670496, 0.003213876, 0.002821363, 
                                        0.002765209, 0.002883229, 0.003257329, 0.002789505, 0.002373275, 
                                        0.002696899, 0.002846016, 0.002207287, 0.002817528)), .Names = c("Jahr", 
                                                                                                         "X0"), class = "data.frame", row.names = c(NA, -26L))
####
data <- transform(data, X1=X0, X2=X0, X3=X0)
limJahr <- 2000
pred.Jahr <- 2001:2020

mypred <- function(x, predJ) {
  m <- lm(x ~ Jahr, data=data.frame(x=x, Jahr=limData$Jahr))
  predict(m, newdata=data.frame(Jahr=predJ))
}

limData <- data[data$Jahr<=limJahr,]
sapply(limData[-1], mypred, predJ=pred.Jahr)
Gruß, Jörg
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

VIelen Dank erstmal für deine Hilfe!

Ich komm leider erst am Nachmittag dazu mir das genauer anzuschauen und melde mich dann nochmal!

LG
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

Hallo!

Ich hätte eine Frage zu deinem Code:

In dieser Zeile

Code: Alles auswählen

data <- transform(data, X1=X0, X2=X0, X3=X0)
verwendest du den transform-Befehl, da die Werte des Datensatzes innerhalb der ersten 4 Spalten (X0,X1,X2,X3) gleich sind oder? Warum macht es einen Unterschied ob ich transform verwende oder nicht? (Die Werte sind ja sowieso gleich -> jedoch liefert der Code, wenn ich ihn ohne transform ausführe eine andere Hochrechnung).
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Dynamische Variablen mit Schleife

Beitrag von jogo »

Hallo wkowalski,
wkowalski hat geschrieben: Mi Sep 06, 2017 9:31 amIn dieser Zeile

Code: Alles auswählen

data <- transform(data, X1=X0, X2=X0, X3=X0)
verwendest du den transform-Befehl, da die Werte des Datensatzes innerhalb der ersten 4 Spalten (X0,X1,X2,X3) gleich sind oder? Warum macht es einen Unterschied ob ich transform verwende oder nicht? (Die Werte sind ja sowieso gleich -> jedoch liefert der Code, wenn ich ihn ohne transform ausführe eine andere Hochrechnung).
bei mir werden die gleichen Werte berechnet. Deshalb musst Du mir schon reproduzierbar Deine Behauptung belegen, bevor ich diese akzeptiere.
Ansonsten habe ich nur die Spalte X0 einige Male kopiert, damit sapply() auch etwas zu tun bekommt.
Außerdem ist es immer gut, die Funktionen with(), within() und transform() vorzuführen, damit R-Neulinge nicht auf andere (in diesem Fall fatale) Gedanken kommen.

Gruß, Jörg
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

Nun ja wenn ich folgenden Code ausführe:

Code: Alles auswählen

limJahr <- 2014
pred.Jahr <- 2015:2020

mypred <- function(x, predJ) {
  m <- lm(x ~ Jahr, data=data.frame(x=x, Jahr=limData$Jahr))
  predict(m, newdata=data.frame(Jahr=predJ))
}

limData <- data[data$Jahr<=limJahr,]
pred_Data <- sapply(limData[-1], mypred, predJ=pred.Jahr)
sieht die Ergebnisvariable (pred_Data) folgendermaßen aus:

X0 X1 X2 X3 X4 X5 X6
1 0.002763365 0.001090663 0.001086770 0.001018289 0.001198883 0.001355343 0.001259439
2 0.002745152 0.001102910 0.001108129 0.001033103 0.001222524 0.001386984 0.001286962
3 0.002726938 0.001115158 0.001129488 0.001047917 0.001246165 0.001418624 0.001314485
4 0.002708725 0.001127406 0.001150846 0.001062731 0.001269806 0.001450265 0.001342008
5 0.002690511 0.001139654 0.001172205 0.001077544 0.001293447 0.001481906 0.001369531
6 0.002672298 0.001151901 0.001193564 0.001092358 0.001317088 0.001513546 0.001397054

Wenn nun der Code

Code: Alles auswählen

data <- transform(data, X1=X0, X2=X0, X3=X0)
limJahr <- 2014
pred.Jahr <- 2015:2020

mypred <- function(x, predJ) {
  m <- lm(x ~ Jahr, data=data.frame(x=x, Jahr=limData$Jahr))
  predict(m, newdata=data.frame(Jahr=predJ))
}

limData <- data[data$Jahr<=limJahr,]
pred_Data <- sapply(limData[-1], mypred, predJ=pred.Jahr)
inkusive des transform-Befehls ausgeführt wird sieht das Ergebnis so aus:

X0 X1 X2 X3 X4 X5 X6
1 0.002763365 0.002763365 0.002763365 0.002763365 0.001198883 0.001355343 0.001259439
2 0.002745152 0.002745152 0.002745152 0.002745152 0.001222524 0.001386984 0.001286962
3 0.002726938 0.002726938 0.002726938 0.002726938 0.001246165 0.001418624 0.001314485
4 0.002708725 0.002708725 0.002708725 0.002708725 0.001269806 0.001450265 0.001342008
5 0.002690511 0.002690511 0.002690511 0.002690511 0.001293447 0.001481906 0.001369531
6 0.002672298 0.002672298 0.002672298 0.002672298 0.001317088 0.001513546 0.001397054

Sieht man sich nun im oberen Ergebnis die erste, zweite, dritte und vierte Spalte (X0,X1,X2,X3) an, fällt auf, dass sich diese vom unteren Ergebnis unterscheiden. Da die lineare Hochrechnung aber bei gleichen Zahlen die gleichen Ergebnisse ausspucken sollte (da im eingelesenen Datensatz auch 4 Spalten ident sind), muss ich davon ausgehen, dass die erste Berechnung (ohne transform) ein falsches Ergebnis liefert. Zur besseren Übersicht habe ich die entsprechenden Spalten farblich markiert. Im ersten Fall unterscheiden sich die Predictions (was mMn nicht der Fall sein sollte --> deswegen habe ich sie rot markiert). Im zweiten Fall berechnet die Funktion für die gleichen Werte auch die gleichen Predictions (in diesem Fall grün markiert)

Brauche ich jetzt diesen transform-Befehl zwingenderweise damit die Auswertung funktioniert oder nicht?

Meine Frage wäre auch wieso du die Werte kopierst? Im Ergebnis stehen in beiden Fällen nur 6 Spalten mit hochgerechneten Daten -> sollten es bei kopierten Werten nicht mehr Spalten sein?

Auf welche fatalen Gedanken könnte ich deiner Meinung nach kommen?
Antworten