Seite 1 von 1

Dateneinlesen mit For-Schleife

Verfasst: Mi Jul 03, 2019 10:57 am
von MSch
Hi Zusammen,

ich habe ein paar Fragen rund um das Einlesen von Daten mit einer For-Schleife.


1)
Der erste Punkt befasst sich mit den abfragen der Daten. Dies mach ich mit folgenden Befehl:

Code: Alles auswählen

PLAN <- read.table("Pläne/PAT00.txt", header=TRUE , sep=",")
Hier ist die Frage wie ich am besten den Namen des txt file (PAT00 --> PAT01....) in der Schleife hochzählen lassen kann.
Hierfür habe ich den "assign(paste(),) " befehl gefunden aber es nicht hinbekommen.


Die Daten werden dann verarbeitet und am Schluss sollen sie so abgespeichert werden:

Code: Alles auswählen

PAT00 <- lapply(ROIs, FUN=mySel) 
names(PAT00) <- ROIs

Auch hier will ich nun dass PAT00 mit der Schleife hochzählt. Was dann so aussehen sollte

Code: Alles auswählen

assign(paste("PAT0",i, sep = ""),lapply(ROIs, FUN=mySel) )
names(PAT00) <- ROIs
wobei ich auch nicht weiß wie ich es bei "names(PAT00) <- ROIs" am besten mach das es mit hoch läuft.

Re: Dateneinlesen mit For-Schleife

Verfasst: Mi Jul 03, 2019 11:06 am
von jogo
Hallo MSch,

bitte nicht assign(), sondern stelle die Dataframes in eine Liste.

Code: Alles auswählen

Dateinamen <- paste0("Pläne/PAT", c("00", "01", "02")) # das geht noch eleganter mit sprintf()
L <- lapply(Dateinamen, function(Datei) read.table(Datei, header=TRUE, sep=","))
Aus dem Rest werde ich leider nicht schlau, z.B. names(PAT00) <- ROIs bedeutet, dass das Objekt ROIs ein character-Vektor sein muss, weshalb ich nicht verstehe, was bei lapply(ROIs, FUN=mySel) die Funktion mySel() mit einem einzelnen character anstellt.

Gruß, Jörg
p.s.:
Bitte verwende Formatierungen für Codeschnippsel: viewtopic.php?f=20&t=29

Re: Dateneinlesen mit For-Schleife

Verfasst: Mi Jul 03, 2019 11:22 am
von MSch
Hi Jogo

danke wieder für die schnelle Antwort.

Ich blicke bei deinem Vorschlag noch nicht ganz durch. Wo kommt hier die Laufvariable (sei es i) bei dir ins Spiel.

was soll die variable "Datei" darstellen? ist das einfach nur der Name anstelle des Pfades????

Re: Dateneinlesen mit For-Schleife

Verfasst: Mi Jul 03, 2019 11:24 am
von jogo
Hallo MSch,

achso, Du möchtest unbedingt ein i sehen. Wenn Du das i so gerne magst als Laufvariable, dann ist dies die Variante für Dich:

Code: Alles auswählen

Dateinamen <- paste0("Pläne/PAT", c("00", "01", "02")) # das geht noch eleganter mit sprintf()
L <- lapply(Dateinamen, function(i) read.table(i, header=TRUE, sep=","))
In meiner vorherigen Version war Datei der formale Parameter der anonymen Funktion.

Gruß, Jörg

Re: Dateneinlesen mit For-Schleife

Verfasst: Mi Jul 03, 2019 11:37 am
von MSch
Okay ich kapier nicht was du machst. Ist R einfach soviel anders als matlab.....


ich such einfach nur nach etwas damit ich einen Variable mit einem String verbinden kann,
damit ich mein Namen PATij mit zwei for schleifen mit Laufvariable i j hochzählen kann.

Re: Dateneinlesen mit For-Schleife

Verfasst: Mi Jul 03, 2019 11:38 am
von MSch
vielleicht fang ich besser noch mal mit einem ordentlich Tutorial an.... das ist so frustrierend. Vorschläge?

Re: Dateneinlesen mit For-Schleife

Verfasst: Mi Jul 03, 2019 11:46 am
von MSch

Code: Alles auswählen

#Packet laden
library(dplyr)

#Workspace aufräumen
rm(list = ls())


#Daten einlesen von Pfad
BRHypo <- read.table("Patientenpläne/PAT00.txt", header=TRUE , sep=",")

#Erstellen eines Arrays mit allen gewünschten ROIs  
ROIs <- c("PTV1","PTV2","Shell1","Shell2","L.Lung","R.Lung","R.Breast","Heart","Ventricle","PTVResidual","PTVRest")
Unit <- c("Dose(Gy)","Vol(cc)")


#Vektor für ROIs mit Dose und Vol definiert
ROIsU <- c("Start")


#For-Schleife fügt den ROIs Einheiten hinzu und erstell Vektor
x=-1
for(i in 1:11){x=x+2;
ROIsU[x]<- paste(ROIs[(x+1)/2],Unit[1]);
ROIsU[x+1] <- paste(ROIs[(x+1)/2],Unit[2]);
}


#Funktion (MySelection) die nach "name" sucht und die 2 folgenden Spalten ausgibt
mySel <- function(name) {
  i <- which(grepl(name, names(BRHypo), fixed=TRUE))
  BRHypo[(i+1):(i+2)]
  }



# Liste der Dataframes
PAT00 <- lapply(ROIs, FUN=mySel) 
names(PAT00) <- ROIs

das ist im Moment mein Skript. Nun will ich einfach nur die Daten die von PAT00 bis PAT99 als txt. file vorhanden sind einlesen sortieren mit der MySel function die einfach nur nach Begriffen sucht und die entsprechenden Spalten dann ausgibt und diese dann wieder in einer Liste für jede Datei mit dem gleichen namen also PAT00 bis PAT99 speichern. Dabei wollte ich einfach zwei For schleifen um den Skript setzen eine die mit "i" PATi0 durchzählt eine die mit "j" PAT0j durchzählt. Aber ich finde keine gescheiden Befehle um mir die Namen in einer Schleifen zusammen zu basteln. Irgendwas was ein String mit der Laufvariablen verbindet und wieder als String ausgibt

Re: Dateneinlesen mit For-Schleife

Verfasst: Mi Jul 03, 2019 12:04 pm
von jogo
MSch hat geschrieben: Mi Jul 03, 2019 11:37 am Okay ich kapier nicht was du machst. Ist R einfach soviel anders als matlab.....
etwas schon, deshalb wechselte ich auch von octave zu R.
ich such einfach nur nach etwas damit ich einen Variable mit einem String verbinden kann,
damit ich mein Namen PATij mit zwei for schleifen mit Laufvariable i j hochzählen kann.

Code: Alles auswählen

for (i in 1:3) for (j in 5:8) print(sprintf("PAT%d%d", i, j))
oder

Code: Alles auswählen

dij <- expand.grid(i=1:3, j=5:8)
dij$pat <- sprintf("PAT%d%d", dij$i, dij$j)
dij

Re: Dateneinlesen mit For-Schleife

Verfasst: Fr Jul 12, 2019 2:57 pm
von MSch
Hi jogo,

nach langem rum machen habe ich festgestellt, dass es viel einfacher war als gedacht. Ich glaube langsam kommt das Gefühl für R^^

Dieser Ansatz hat mich zum Ziel geführt:

Code: Alles auswählen

for (i in 1:3) for (j in 5:8) print(sprintf("PAT%d%d", i, j))

Vielen Dank