Dateneinlesen mit For-Schleife

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

Moderatoren: EDi, jogo

Antworten
MSch
Beiträge: 18
Registriert: Di Mai 28, 2019 1:21 pm

Dateneinlesen mit For-Schleife

Beitrag 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.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Dateneinlesen mit For-Schleife

Beitrag 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
MSch
Beiträge: 18
Registriert: Di Mai 28, 2019 1:21 pm

Re: Dateneinlesen mit For-Schleife

Beitrag 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????
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Dateneinlesen mit For-Schleife

Beitrag 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
MSch
Beiträge: 18
Registriert: Di Mai 28, 2019 1:21 pm

Re: Dateneinlesen mit For-Schleife

Beitrag 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.
MSch
Beiträge: 18
Registriert: Di Mai 28, 2019 1:21 pm

Re: Dateneinlesen mit For-Schleife

Beitrag von MSch »

vielleicht fang ich besser noch mal mit einem ordentlich Tutorial an.... das ist so frustrierend. Vorschläge?
MSch
Beiträge: 18
Registriert: Di Mai 28, 2019 1:21 pm

Re: Dateneinlesen mit For-Schleife

Beitrag 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
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Dateneinlesen mit For-Schleife

Beitrag 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
MSch
Beiträge: 18
Registriert: Di Mai 28, 2019 1:21 pm

Re: Dateneinlesen mit For-Schleife

Beitrag 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
Antworten