Seite 1 von 3

werte aus for-schleife speichern

Verfasst: Mi Sep 06, 2017 3:46 am
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

Re: werte aus for-schleife speichern

Verfasst: Mi Sep 06, 2017 6:56 am
von bigben

Re: werte aus for-schleife speichern

Verfasst: Do Sep 07, 2017 3:25 pm
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

Re: werte aus for-schleife speichern

Verfasst: Do Sep 07, 2017 5:46 pm
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

Re: werte aus for-schleife speichern

Verfasst: Do Sep 07, 2017 10:58 pm
von jessi
Hallo,

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

Grüße, Jess

Re: werte aus for-schleife speichern

Verfasst: Mi Feb 06, 2019 2:13 pm
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=",")  
  
}

Re: werte aus for-schleife speichern

Verfasst: Mi Feb 06, 2019 3:52 pm
von jogo
Hallo jasi,

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

Gruß, Jörg

Re: werte aus for-schleife speichern

Verfasst: Mi Feb 06, 2019 4:00 pm
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

Re: werte aus for-schleife speichern

Verfasst: Mi Feb 06, 2019 4:07 pm
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

Re: werte aus for-schleife speichern

Verfasst: Mi Feb 06, 2019 4:16 pm
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