Dynamische Variablen mit Schleife

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

Moderatoren: EDi, jogo

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

Re: Dynamische Variablen mit Schleife

Beitrag von jogo »

wkowalski hat geschrieben: Mi Sep 06, 2017 1:49 pm Nun ja wenn ich folgenden Code ausführe: ...
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. ...
Du führst den Code aber nicht auf den gleichen Daten aus wie in meinem Codebeispiel :!:
Während ich nur den Dataframe habe, in dem zusätzlich zum Jahr nur die Spalte X0 enthalten ist, hast Du die Befehle auf Deinen ursprünglichen Dataframe angewendet.
Brauche ich jetzt diesen transform-Befehl zwingenderweise damit die Auswertung funktioniert oder nicht?
Auf Deinen ursprünglichen Dataframe darfst Du auf gar keinen Fall den von mir verwendeten Aufruf der Funktion transform() anwenden, weil dieser sonst Deine kostbaren Daten über den Jordan schickt :!:
BTW: warum hast Du eigentlich nicht die Definition des Dataframes übernommen wie sie in meinem Code steht? :?
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?
Die erste Frage habe ich schon gestern beantwortet.
Zur zweiten Frage: nein, denn die betroffenen Spalten werden überschrieben (wenn sie bereits vorhanden sind).
Nur wenn sie nicht vorhanden sind, werden sie neu angelegt.
Auf welche fatalen Gedanken könnte ich deiner Meinung nach kommen?
Du könntest eine Funktion verwenden wollen, deren Name hier nicht genannt werden darf (- so böse ist diese Funktion!).

Gruß, Jörg
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

Du führst den Code aber nicht auf den gleichen Daten aus wie in meinem Codebeispiel :!:
Oha! Sorry, das hab ich übersehen :!:
Auf Deinen ursprünglichen Dataframe darfst Du auf gar keinen Fall den von mir verwendeten Aufruf der Funktion transform() anwenden, weil dieser sonst Deine kostbaren Daten über den Jordan schickt :!: BTW: warum hast Du eigentlich nicht die Definition des Dataframes übernommen wie sie in meinem Code steht? :?
Ja, das macht Sinn :D erklärt aber nicht warum meine ersten 4 Spalten dann unterschiedliche Werte enthalten. Durch die lineare Regression wird ja eine möglichst passende Linie durch meine Datenpunkte gelegt und anschließend die nächsten Punkte auf der Linie (durch predict()) berechnet. In meinem Fall sollten die ersten 4 Spalten dann ja die identen Predictions enthalten oder irre ich mich?

Hab es wie gesagt übersehen :roll:
Zur zweiten Frage: nein, denn die betroffenen Spalten werden überschrieben (wenn sie bereits vorhanden sind).
Das ist gut zu wissen ;)
Du könntest eine Funktion verwenden wollen, deren Name hier nicht genannt werden darf (- so böse ist diese Funktion!).
Quasi die Voldemort-Funktion?! :D
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Dynamische Variablen mit Schleife

Beitrag von jogo »

wkowalski hat geschrieben: Mi Sep 06, 2017 7:54 pm
Auf Deinen ursprünglichen Dataframe darfst Du auf gar keinen Fall den von mir verwendeten Aufruf der Funktion transform() anwenden, weil dieser sonst Deine kostbaren Daten über den Jordan schickt :!: BTW: warum hast Du eigentlich nicht die Definition des Dataframes übernommen wie sie in meinem Code steht? :?
Ja, das macht Sinn :D erklärt aber nicht warum meine ersten 4 Spalten dann unterschiedliche Werte enthalten. Durch die lineare Regression wird ja eine möglichst passende Linie durch meine Datenpunkte gelegt und anschließend die nächsten Punkte auf der Linie (durch predict()) berechnet. In meinem Fall sollten die ersten 4 Spalten dann ja die identen Predictions enthalten oder irre ich mich?

Hab es wie gesagt übersehen :roll:
Wie gesagt:
Du hattest mir nur den Dataframe geliefert mit den beiden Spalten Jahr und X0, die anderen Spalten Deines originalen Dataframes kenne ich nicht, aber ich vermute, dass die Spalten X1 ... X4 in Deinem originalen Dataframe verschieden von der Spalte X0 sind.

Code: Alles auswählen

with(limData, max(abs(X1-X0))) # versus:
with(limData, max(abs(X0-X0)))
Du könntest eine Funktion verwenden wollen, deren Name hier nicht genannt werden darf (- so böse ist diese Funktion!).
Quasi die Voldemort-Funktion?! :D
so ist es: es handelt sich um tiefste schwarze Magie, die nicht zu beherrschen ist. Selbst halbwegs Kundige, die versucht haben, diese für sich zu nutzen, mussten oft die Qualen mehrstündigen Debuggens erleiden.
Die weiße Magie habe ich Dir gezeigt: with(), within(), transform() - zusätzlich sollte ich Dich noch darauf hinweisen, dass etliche Funktionen den Parameter data= kennen.

Gruß, Jörg
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

Ah jetzt wird mir einiges klar ;)

Hier nochmal der Datensatz den ich verwende:

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), X1 = c(0.000652742, 
0.000653723, 0.000544034, 0.000927038, 0.001038739, 0.000935872, 
0.000867124, 0.000804148, 0.001057385, 0.000658921, 0.0007864, 
0.000617871, 0.000990958, 0.000884782, 0.001689317, 0.001002813, 
0.001014877, 0.000989908, 0.00128063, 0.000865994, 0.000754945, 
0.001154167, 0.000881523, 0.00112217, 0.000850712, 0.001031472
), X2 = c(0.00042304, 0.000844688, 0.000600304, 0.000363535, 
0.000561097, 0.000485496, 0.000690552, 0.000679026, 0.000592129, 
0.000638541, 0.000591872, 0.000782869, 0.000995662, 0.000910635, 
0.000902703, 0.001273949, 0.000895537, 0.000809995, 0.001178394, 
0.000833681, 0.000960142, 0.001103172, 0.000783296, 0.000926111, 
0.000895559, 0.001037169), X3 = c(0.000461802, 0.000814171, 0.001182525, 
0.000652673, 0.000547784, 0.000557483, 0.000564596, 0.000627238, 
0.000555007, 0.000486309, 0.000527241, 0.00065475, 0.001217803, 
0.001132075, 0.001027046, 0.000919007, 0.000989144, 0.001008864, 
0.000856164, 0.000791595, 0.000806511, 0.001251564, 0.001025872, 
0.000949991, 0.001043764, 0.00062494), X4 = c(0.000630476, 0.000501122, 
0.000738104, 0.000818031, 0.000602898, 0.00054448, 0.000639426, 
0.000661973, 0.000545907, 0.000514097, 0.000654533, 0.00074408, 
0.000805854, 0.000868949, 0.001474064, 0.001091888, 0.001366087, 
0.001446397, 0.001219804, 0.001290574, 0.00100356, 0.001121158, 
0.000881144, 0.000996314, 0.000896383, 0.000815721), X5 = c(0.000603513, 
0.000691055, 0.00056014, 0.000512908, 0.000766006, 0.000684505, 
0.000647236, 0.000597064, 0.000721674, 0.00068741, 0.000677632, 
0.000778816, 0.000852757, 0.00108279, 0.001248553, 0.001091982, 
0.000793574, 0.00138092, 0.001270741, 0.001145639, 0.001505768, 
0.001264403, 0.001169591, 0.001195151, 0.001215398, 0.000987833
), X6 = c(0.000560969, 0.000558024, 0.000985095, 0.000510345, 
0.000635042, 0.000784813, 0.000581287, 0.000604393, 0.000411286, 
0.000621841, 0.000605938, 0.000778051, 0.000925439, 0.001219618, 
0.000688987, 0.001015893, 0.001106858, 0.001194172, 0.00144759, 
0.001393064, 0.001214633, 0.001018577, 0.001120381, 0.001093534, 
0.001021525, 0.000987484)), .Names = c("Jahr", "X0", "X1", "X2", 
"X3", "X4", "X5", "X6"), class = "data.frame", row.names = c(NA, 
-26L))
O.k jetzt hab ich den Fehler gefunden glaub ich ;) der transform-Befehl hat mir (wie du schon gesagt hast) mein Datenset komplett durcheinandergebracht und deswegen hat dann auch das Ausführen in den ersten 4 Spalten zum gleichen Ergebnis geführt. Jetzt kenn ich mich wieder aus.

Im nächsten Schritt muss ich mich daran setzen die vorhergesagten Werte zusammen mit den alten Werten in eine Excel-Datei zu schreiben.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Dynamische Variablen mit Schleife

Beitrag von jogo »

wkowalski hat geschrieben: Mi Sep 06, 2017 8:55 pmIm nächsten Schritt muss ich mich daran setzen die vorhergesagten Werte zusammen mit den alten Werten in eine Excel-Datei zu schreiben.
Hast Du Dich schon entschieden wie die Daten angeordnet werden sollen?
a) nebeneinander --> cbind(...)
b) untereinander --> rbind(...)

Gruß, Jörg

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), X1 = c(0.000652742, 
                                                                                                            0.000653723, 0.000544034, 0.000927038, 0.001038739, 0.000935872, 
                                                                                                            0.000867124, 0.000804148, 0.001057385, 0.000658921, 0.0007864, 
                                                                                                            0.000617871, 0.000990958, 0.000884782, 0.001689317, 0.001002813, 
                                                                                                            0.001014877, 0.000989908, 0.00128063, 0.000865994, 0.000754945, 
                                                                                                            0.001154167, 0.000881523, 0.00112217, 0.000850712, 0.001031472
                                                ), X2 = c(0.00042304, 0.000844688, 0.000600304, 0.000363535, 
                                                          0.000561097, 0.000485496, 0.000690552, 0.000679026, 0.000592129, 
                                                          0.000638541, 0.000591872, 0.000782869, 0.000995662, 0.000910635, 
                                                          0.000902703, 0.001273949, 0.000895537, 0.000809995, 0.001178394, 
                                                          0.000833681, 0.000960142, 0.001103172, 0.000783296, 0.000926111, 
                                                          0.000895559, 0.001037169), X3 = c(0.000461802, 0.000814171, 0.001182525, 
                                                                                            0.000652673, 0.000547784, 0.000557483, 0.000564596, 0.000627238, 
                                                                                            0.000555007, 0.000486309, 0.000527241, 0.00065475, 0.001217803, 
                                                                                            0.001132075, 0.001027046, 0.000919007, 0.000989144, 0.001008864, 
                                                                                            0.000856164, 0.000791595, 0.000806511, 0.001251564, 0.001025872, 
                                                                                            0.000949991, 0.001043764, 0.00062494), X4 = c(0.000630476, 0.000501122, 
                                                                                                                                          0.000738104, 0.000818031, 0.000602898, 0.00054448, 0.000639426, 
                                                                                                                                          0.000661973, 0.000545907, 0.000514097, 0.000654533, 0.00074408, 
                                                                                                                                          0.000805854, 0.000868949, 0.001474064, 0.001091888, 0.001366087, 
                                                                                                                                          0.001446397, 0.001219804, 0.001290574, 0.00100356, 0.001121158, 
                                                                                                                                          0.000881144, 0.000996314, 0.000896383, 0.000815721), X5 = c(0.000603513, 
                                                                                                                                                                                                      0.000691055, 0.00056014, 0.000512908, 0.000766006, 0.000684505, 
                                                                                                                                                                                                      0.000647236, 0.000597064, 0.000721674, 0.00068741, 0.000677632, 
                                                                                                                                                                                                      0.000778816, 0.000852757, 0.00108279, 0.001248553, 0.001091982, 
                                                                                                                                                                                                      0.000793574, 0.00138092, 0.001270741, 0.001145639, 0.001505768, 
                                                                                                                                                                                                      0.001264403, 0.001169591, 0.001195151, 0.001215398, 0.000987833
                                                                                                                                          ), X6 = c(0.000560969, 0.000558024, 0.000985095, 0.000510345, 
                                                                                                                                                    0.000635042, 0.000784813, 0.000581287, 0.000604393, 0.000411286, 
                                                                                                                                                    0.000621841, 0.000605938, 0.000778051, 0.000925439, 0.001219618, 
                                                                                                                                                    0.000688987, 0.001015893, 0.001106858, 0.001194172, 0.00144759, 
                                                                                                                                                    0.001393064, 0.001214633, 0.001018577, 0.001120381, 0.001093534, 
                                                                                                                                                    0.001021525, 0.000987484)), .Names = c("Jahr", "X0", "X1", "X2", 
                                                                                                                                                                                           "X3", "X4", "X5", "X6"), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                                                        -26L))
###
limJahr <- 2000
pred.Jahr <- 2001:2014

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,]
d.pred <- sapply(limData[-1], mypred, predJ=pred.Jahr)

cbind(data[data$Jahr %in% pred.Jahr,], d.pred) # a)
rbind(data[data$Jahr %in% pred.Jahr,], cbind(Jahr=pred.Jahr, d.pred)) # b)
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

Hey!

Ja, ich würde die Daten gerne untereinander anordnen und anschließend in eine neue Excel-Datei schreiben.

Müsste der Befehl um den alten Datensatz und die Predictions zusammenzuführen nicht lauten:

Code: Alles auswählen

data_new <- rbind(data, cbind(Jahr=pred.Jahr, pred_Data))


Noch eine Frage hat sich gerade ergeben:

Wie sieht es aus wenn ich 60 verschiedene Excel-Dateien habe und ich bei allen diese Vorhersagen machen möchte? Wie fange ich das am besten an?

Gruß
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Dynamische Variablen mit Schleife

Beitrag von jogo »

wkowalski hat geschrieben: Mo Sep 11, 2017 2:24 pmMüsste der Befehl um den alten Datensatz und die Predictions zusammenzuführen nicht lauten:

Code: Alles auswählen

data_new <- rbind(data, cbind(Jahr=pred.Jahr, pred_Data))
wenn Du das so möchtest, ja.
Wie sieht es aus wenn ich 60 verschiedene Excel-Dateien habe und ich bei allen diese Vorhersagen machen möchte? Wie fange ich das am besten an?
Dann steckt man den bisherigen Code in eine Funktion:

Code: Alles auswählen

ArbeitsTier <- function(Dateiname) {
   # 1. Einlesen der Excel-Datei mit dem Namen Dateiname
   # 2. Datei verarbeiten
   # 3. Namen für die Ausgabedatei konstruieren aus Dateiname
   # 4. Ausgabedatei schreiben
}
Dann benötigt man noch einen Vektor mit den Namen der Inputdateien:

Code: Alles auswählen

# 1. setwd(...)
# 2. DateinamenListe <- ... # per Hand definieren oder mit dir(...) oder ähnlich
# 3. lapply(DateinamenListe, ArbeitsTier)
Gruß, Jörg
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

Ich setz mich morgen daran ;)

Vielen Dank erstmal für die Hilfe!

Lass dich dann wissen wie ich weiterkomme

LG
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

Bin gerade dabei die Funktion zu schreiben, die mir meine Excel-Dateien automatisch auswertet und anschließend in eine neue Excel schreibt.

Zu Beginn habe ich mir die Dateinamen der Files die eingelesen werden sollen mit folgendem Befehl in eine Variable gespeichert:

Code: Alles auswählen

dateiNamen <- dir(path="F:/",pattern=".csv",all.files=T)
Um die Funktion zu testen wollte ich zuerst die .csv-Dateien einlesen, mir einen neuen Namen für die Exceldateien zusammenbasteln und anschließend den identen Datensatz in die neuen Dateien schreiben.

Meine Funktion sieht zurzeit so aus:

Code: Alles auswählen

Auswertung <- function(Dateiname){
  
  data <- read.csv(Dateiname,header = T,sep=";",dec=",")
  Ausgabedatei <- paste("output_",dateiNamen,sep="")
  write.csv(data, file = Ausgabedatei,row.names=F,col.names=T)
  
}
Der Funktionsaufruf sieht folgendermaßen aus:

Code: Alles auswählen

lapply(dateiNamen,Auswertung) 
Nun schaffe ich es nicht, dass die .csv-Dateien mit dem richtigen Namen (mit "output_" davor) geschrieben werden.

Kann ich die eingelesenen Daten in eine Variable entsprechend des alten Dateinamens speichern oder wie gehe ich am besten vor?

LG
Zuletzt geändert von wkowalski am Di Sep 12, 2017 4:34 pm, insgesamt 1-mal geändert.
wkowalski

Re: Dynamische Variablen mit Schleife

Beitrag von wkowalski »

Habe nun noch etwas weiter am Code geschrieben

Mittlerweile sieht es so aus:

Code: Alles auswählen

dateiNamen <- dir(path="F:/",pattern="morb",all.files=T)

Auswertung <- function(Dateiname){
  
  data <- read.csv(Dateiname,header = T,sep=";",dec=",")
 
  
  write.csv(data[[Dateiname]], file = paste("output_",Dateiname,sep=""),row.names=F,col.names=T)
  
  
}

fun <- lapply(dateiNamen,Auswertung) 
Nun schreibt mir das Programm zumindest mal leere .csv-Dateien mit den gewünschten Namen. Wie bekomme ich jetzt meine ursprünglichen Daten noch in die csv.-Dateien?

[Edit:] Habe jetzt noch ein paar Kleinigkeiten am Code verändert

Code: Alles auswählen

dateiNamen <- dir(path="F:/",pattern="morb",all.files=T)

Auswertung <- function(Dateiname){
  
  data <- read.csv(Dateiname,header = T,sep=";",dec=",")
  
  Ausgabedatei <- paste("F:/Prognose/","output_",Dateiname,sep="")
  
  write.csv(data, file = Ausgabedatei,row.names=F,col.names=T)
  
}

fun <- lapply(dateiNamen,Auswertung)  
Nun werden nach dem Ausführen der Auswertungs-Funktion .csv-Dateien in den Ordner "Prognose" geschrieben (und enthalten dieselben Werte wie die eingelesenen Excel Dateien). Diese .csv-Files haben den selben Namen wie die eingelesenen Dateien, jedoch mit "output_" davor. Komischerweise hatte ich den Code heute schon einmal so wie oben --> jedoch hat das Ganze dann nicht so funktioniert wie ich wollte.

Jetzt geht es daran, dass ich meine eigentliche Vorhersage mit dem linearen Modell in die Funktion Auswertung einbetten muss. Soll ich dazu in der Funktion eine weitere Funktion aufrufen oder ist dies eher nicht zu empfehlen?

[Edit 2:]

Das Programm läuft jetzt und tut (glaube ich) was es soll:

Code: Alles auswählen

dateiNamen <- dir(path="F:/",pattern="morb",all.files=T)

limJahr_morb <- 2014
pred_Jahr_morb <- 2015:2050

Auswertung <- function(Dateiname){
  
  #Einlesen der Dateien
  test <- read.csv(Dateiname,header=T,sep=";",dec=",")
  
  pred_morb <- function(test,predJ){
    m <- lm(test ~ Jahr, data=data.frame(test=test, Jahr=1989:2014))
    predict(m, newdata=data.frame(Jahr=predJ))
  }
  
  predictedData <- sapply(test[-1],pred_morb,predJ=pred_Jahr_morb)
  
  #Zusammenstellung des Ausgabedateinamens
  Ausgabedatei <- paste("F:/","output_",Dateiname,sep="")
  
  #Schreiben der .csv-Dateien
  write.csv(rbind(test,cbind(Jahr=pred_Jahr_morb,predictedData)), file=Ausgabedatei,row.names=F,col.names=T)
  
}

t <- lapply(dateiNamen,Auswertung)
LG
Antworten