werte aus for-schleife speichern

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

Moderatoren: EDi, jogo

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

werte aus for-schleife speichern

Beitrag von jessi »

Hallo zusammen,

ich habe eine for-Schleife

Code: Alles auswählen

p <- c(44,46,47,48,49)
l <- c(15,14,16,16,12)

for (i in 1:5){
count_T <- dbGetQuery(conn,paste("SELECT 
                   CASE WHEN T IS NULL THEN -9999
                   WHEN T < 0 THEN 0
                   WHEN (T >=0 AND T <5) THEN 1
 		   WHEN (T >=5 AND T <10) THEN 2
 		   ELSE 10	
		  END AS bin,
	          COUNT(1) as count
                  FROM data
                  WHERE (phi =",p[i],")
                 AND (lam = ",l[i],")
               GROUP BY bin;/n"))
print(count_T)}
Soweit, so gut. Jetzt möchte ich die jeweiligen Werte (also count_T bei p = 44 und l = 15, count_T bei p = 46, l=14 usw) in ein csv-file speichern. Am besten mit den dazugehörigen p und l Werten. Probiert habe ich es mit

Code: Alles auswählen

for (i in 1:5){
... Schleife ...

df <- data.frame(p,l.count_t)
write.table(df, file =...)  }
Nur hat es mir jetzt immer nur den letzten Schleifen-Durchlauf abgespeichert :| Wie kann ich denn den Output meiner Schleifendurchläufe am besten abspeichern?

Danke und liebe Grüße,
Jessi
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: werte aus for-schleife speichern

Beitrag von bigben »

---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: werte aus for-schleife speichern

Beitrag von jessi »

Hallo Bernhard,

danke für den Hinweis, das einlesen klappt schon mal. Jetzt möchte ich meine Ausgabe noch etwas verfeinern, weiß aber nicht, wie ich die Zuordnung richtig einbauen soll.

Code: Alles auswählen


p <- c(44,46,47,48,49)
l <- c(15,14,16,16,12)
count_T <- data.frame(name=character(0), len=numeric(0))
for (i in 1:5){
count_T <- rbind(count_T, data.frame(dbGetQuery(conn,paste("SELECT 
                   CASE WHEN T IS NULL THEN -9999
                   WHEN T < 0 THEN 0
                   WHEN (T >=0 AND T <5) THEN 1
 		   WHEN (T >=5 AND T <10) THEN 2
 		   ELSE 10	
		  END AS bin,
	          COUNT(1) as count
                  FROM data
                  WHERE (phi =",p[i],")
                 AND (lam = ",l[i],")
               GROUP BY bin;/n"))))


> print(count_T)
   bin count
1  0   859
2  1     1
3  2     2
4  10     1
5  0   855
6  1    1
7  2     3
8  3     1
Um die Daten später besser zuordnen zu können möchte ich gerne p und l dazu schreiben, dass der Output in etwa so aussieht:

Code: Alles auswählen

 
 print(count_T)
 p   l   bin count
44 15  0     859
44 15  1     1
44 15   2     2
44 15 10     1

46 14  0   855
46 14  1    1
46 14  2     3
46 14 3     1
Danke für eure Ratschläge.

Grüße, Jess
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: werte aus for-schleife speichern

Beitrag von bigben »

Wenn ich die Frage richtig verstehe, dann musst Du nur bei jedem Schleifendurchgang das jeweilige p[i] und das l[i] mit in den Dataframe schreiben. Du musst p[i] und l[i] also in die data.frame-Anweisung schreiben, die Du im rbind-Aufruf benutzt.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: werte aus for-schleife speichern

Beitrag von jessi »

Hallo,

super danke, jetzt funktioniert es. Ich hatte es ohne den Index :roll:

Grüße, Jess
jasi
Beiträge: 7
Registriert: Di Feb 05, 2019 4:34 pm

Re: werte aus for-schleife speichern

Beitrag von jasi »

Hallo,

ich habe ein ähnliches Problem mit meinem Code. In meinem Output werden leider nur die Ergebnisse des letzte Durchlauf ausgegeben. Was kann ich tun, damit alle Ergebnisse pro Iteration abgespeichert und ausgegeben werden?

Vielen Dank im Voraus

Code: Alles auswählen

x_exp<-as.matrix(data[1:100,2:96])
y_exp<-Surv(data$timeDFS[1:100],data$statusDFS[1:100])

for(i in 0:3){
    
  fit <- glmnet::glmnet(x_exp,y_exp,family="cox", alpha=1)
  
  t <- floor(runif(1, 1, 100))
  print(paste0("ZV:", t))
  
  set.seed(t)
  cv.fit <- cv.glmnet(x_exp,y_exp,family="cox", alpha=1)
  plot(cv.fit)
  lambda.min <- cv.fit$lambda.min
  
  coefficients <- coef(fit,s=cv.fit$lambda.min)
  active.index <- which(coefficients!=0)
  active.coefficients <- coefficients[active.index]
  
  print(paste0(active.index))
  
  print(paste0("lambda.min:", lambda.min))
  print (coefficients)
  print(active.coefficients)
  
  write.table(cbind(active.coefficients, active.index, lambda.min), "mydata.txt", sep=",")  
  
}
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: werte aus for-schleife speichern

Beitrag von jogo »

Hallo jasi,

willkommen im Forum!
Was sollen die Ergebnisse der Schleife sein?

Gruß, Jörg
jasi
Beiträge: 7
Registriert: Di Feb 05, 2019 4:34 pm

Re: werte aus for-schleife speichern

Beitrag von jasi »

Hallo Jörg,

die Schleife sollte pro Durchlauf (i) die Lasso-Cox-Regression für einen zuvor eingelesenen Datensatz berechnen. Pro Durchlauf soll mir R die coefficients (CoefficientenListe) und die Varibalen " active.coefficient, active.index und lambd.min" ausgeben. Das macht der Code auch und gibt mir in der Console pro Durchlauf alles an.
Jedoch möchte ich mit dem letzten Befehl write.table, dass er mir für alle Durchläufe i alle Variablen (=alle pro Durchlauf) in einer Textdatei ausgibt.
Leider gibt er mir aber immer nur die Werte für den letzten Durchlauf aus. Das heißt er überschreibt alle Werte.

Wie bekomme ich das hin, dass ich alle Werte für jede Iteration mit write.table ausgespuckt bekomme?
Ich bin regelrecht am verzweifeln
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: werte aus for-schleife speichern

Beitrag von bigben »

Erstens das da nochmal:
bigben hat geschrieben: Mi Sep 06, 2017 6:56 am viewtopic.php?f=20&t=30
LG,
Bernhard
Du schreibst halt bei jedem Schleifendurchlauf eine neue Datei und überschreibst damit die alten Daten. Ansatz Nummer 1 wäre, mit einem der im oben verlinkten Thread zitierten Mittel die Daten aufzuheben.

Zweitens:

Wenn Dir erstens zu kompliziert erscheint, dann kannst Du mit

Code: Alles auswählen

help(write.table)
alle möglichen Steuerargumente für die Funktion write.table finden. Darunter auch das Argument append welches Dein Problem beheben sollte.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jasi
Beiträge: 7
Registriert: Di Feb 05, 2019 4:34 pm

Re: werte aus for-schleife speichern

Beitrag von jasi »

Hallo Bernhard,

deine Verlinkung hatte ich schon ausprobiert. Leider hat das nicht funktioniert..
Mit append bin ich auch schon am rumspielen, doch leider gibt dies mir nur die letzten 2 Durchläufe an und den Rest nicht:

x_exp<-as.matrix(data[1:100,2:96])
y_exp<-Surv(data$timeDFS[1:100],data$statusDFS[1:100])

for(i in 0:3){
M <- cbind(active.index, active.coefficients, lambda.min)
append(M, cbind(active.coefficients, active.index, lambda.min))

fit <- glmnet::glmnet(x_exp,y_exp,family="cox", alpha=1)

t <- floor(runif(1, 1, 100))
print(paste0("ZV:", t))

set.seed(t)
cv.fit <- cv.glmnet(x_exp,y_exp,family="cox", alpha=1)
plot(cv.fit)
lambda.min <- cv.fit$lambda.min

coefficients <- coef(fit,s=cv.fit$lambda.min)
active.index <- which(coefficients!=0)
active.coefficients <- coefficients[active.index]

print(paste0(active.index))

print(paste0("lambda.min:", lambda.min))
print(active.coefficients)
print (coefficients)


write.table(append(M, cbind(active.index,active.coefficients, lambda.min)), "M.txt")

#write.table(cbind(active.coefficients, active.index, lambda.min), "mydata.txt", sep=",")

}

Lieb Grüße
Jasi
Antworten