Seite 1 von 1

Funktion auf Reihen eines dataframes anwenden

Verfasst: Mo Jan 15, 2018 3:09 pm
von FridaKoriander
Hallo zusammen,

ich habe einen Datensatz (agg_data) mit geschätzten Parametern eines Linear Ballistic Accumulator Models (LBA).
cond1 cond2 s vs b t0 A
...

Aus diesen Parametern würde ich gerne Verteilungen generieren. Das Package mit welchem ich arbeite (glba) bietet hierfür folgende Funktion an:

Code: Alles auswählen

rlba(n, b, A, vs, s, t0, st0 = 0, truncdrifts = 0)

Hieraus ergibt sich ein neuer Datensatz mit zwei Variablen ("rt", "resp").

Was ich jetzt gerne machen würde, ist, die rlba-Funktion für jede Reihe meines agg_data-Datensatzes anwenden und die sich daraus ergebenden Datensätze in eigenen files speichern.

Was ich bisher versucht habe, ist folgendes:

Code: Alles auswählen

for (row in 1:nrow(agg_data))
{tmp<-rlba(1000, b =(agg_data[,3]+agg_data[,4]), A = agg_data[,4], vs = c(agg_data[,5], 1agg_data[,5]), s=agg_data[,6], t0 =agg_data[,7], st0 = 0, truncdrifts = TRUE)

myfile <- file.path("myfilepath", paste0(cond1, "_", cond2, ".dat"))
write.table(tmp, file = myfile, sep = "\t", row.names = FALSE, col.names = TRUE,
            quote = FALSE, append = FALSE)
rm(tmp, myfile)

}
So ganz mag das leider noch nicht funktionieren, vielleicht kann mir ja hier im Forum jemand weiterhelfen.
Besten Dank schon mal!
Viele Grüße
Frida

Re: Funktion auf Reihen eines dataframes anwenden

Verfasst: Mo Jan 15, 2018 3:23 pm
von bigben
Hallo Frida,

FridaKoriander hat geschrieben: Mo Jan 15, 2018 3:09 pm

Code: Alles auswählen

for (row in 1:nrow(agg_data))
{tmp<-rlba(1000, b =(agg_data[,3]+agg_data[,4]), A = agg_data[,4], vs = c(agg_data[,5], 1agg_data[,5]), s=agg_data[,6], t0 =agg_data[,7], st0 = 0, truncdrifts = TRUE)

myfile <- file.path("myfilepath", paste0(cond1, "_", cond2, ".dat"))
write.table(tmp, file = myfile, sep = "\t", row.names = FALSE, col.names = TRUE,
            quote = FALSE, append = FALSE)
rm(tmp, myfile)

}
Kann es sein, dass die Variable row in der ganzen Schleife nicht einmal vorkommt? Dann würde die Schleife nrow(agg_data) Mal das gleiche tun.

LG,
Bernhard

Re: Funktion auf Reihen eines dataframes anwenden

Verfasst: Mo Jan 15, 2018 3:36 pm
von jogo
Hallo Frida,
FridaKoriander hat geschrieben: Mo Jan 15, 2018 3:09 pm Hallo zusammen,

ich habe einen Datensatz (agg_data) mit geschätzten Parametern eines Linear Ballistic Accumulator Models (LBA).
cond1 cond2 s vs b t0 A
...

Aus diesen Parametern würde ich gerne Verteilungen generieren. Das Package mit welchem ich arbeite (glba) bietet hierfür folgende Funktion an:

Code: Alles auswählen

rlba(n, b, A, vs, s, t0, st0 = 0, truncdrifts = 0)
wenn die Funktionen des Paketes glba so wie üblich benannt worden sind, sollte diese Funktion entsprechende Zufallszahlen generieren.

Hieraus ergibt sich ein neuer Datensatz mit zwei Variablen ("rt", "resp").

Was ich jetzt gerne machen würde, ist, die rlba-Funktion für jede Reihe meines agg_data-Datensatzes anwenden und die sich daraus ergebenden Datensätze in eigenen files speichern.
Was machst Du denn mit diesen vielen Dateien?
Wenn jetzt die Antwort lautet "demnächst wieder in R einlesen", dann ist das Schreiben der Dateien der falsche Weg (wenn es keine anderen zwingenden Gründe gibt). Der richtige Weg in diesem Fall ist die Verwendung von Listen.

Was ich bisher versucht habe, ist folgendes:

Code: Alles auswählen

for (row in 1:nrow(agg_data))
{tmp<-rlba(1000, b =(agg_data[,3]+agg_data[,4]), A = agg_data[,4], vs = c(agg_data[,5], 1agg_data[,5]), s=agg_data[,6], t0 =agg_data[,7], st0 = 0, truncdrifts = TRUE)

myfile <- file.path("myfilepath", paste0(cond1, "_", cond2, ".dat"))
write.table(tmp, file = myfile, sep = "\t", row.names = FALSE, col.names = TRUE,
            quote = FALSE, append = FALSE)
rm(tmp, myfile)

}
Du verwendest die Laufvariable row nicht innerhalb der Schleife :!:
Ich vermute, Du wolltest etwas schreiben wie:

Code: Alles auswählen

tmp<-rlba(1000, b =(agg_data[row, 3]+agg_data[row, 4]), A = agg_data[row, 4], vs = c(agg_data[row, 5], 1agg_data[row, 5]), ...) 
Für das Erzeugen der Liste kannst Du verwenden:

Code: Alles auswählen

n <- nrow(agg_data)
L <- list()
length(L) <- n
for (i in 1:n) L[[i]] <- rlba(1000, b =(agg_data[i, 3]+agg_data[i, 4]), A = agg_data[i, 4], vs = c(agg_data[i, 5], 1agg_data[i, 5]), ...)
Was sind eigentlich die Objekte cond1 und cond2 :?:

Und ja, es gibt auch noch elegantere Methoden: https://stackoverflow.com/questions/150 ... nts-from-e

Gruß, Jörg

Re: Funktion auf Reihen eines dataframes anwenden

Verfasst: Di Jan 16, 2018 9:55 am
von FridaKoriander
Hallo zusammen,

vielen vielen Dank erst mal! Das hat mir schon sehr weitergeholfen. Das mit der Liste ist ein guter Punkt, für´s weitere Analysieren macht es das auf jeden Fall einfacher, nichtsdestotrotz muss ich die files einzeln noch speichern. Das bekomme ich aber hin.
Eine Frage hätte ich allerdings noch: cond1 und cond2 sollen verschiedene Bedingungen darstellen. Sagen wir, cond1 hat die Stufen A und B und cond2 die Stufen x, y, z. Wie kann ich am geschicktesten meine Listen anhand der Kombination der Stufen benennen? Also Liste 1 soll A-x sein, Liste 2 A-y, Lsite 3 A-z, Liste 4 B-x usw...

Hätte da noch jemand einen Vorschlag?
Besten Dank im Voraus!

Frida

Re: Funktion auf Reihen eines dataframes anwenden

Verfasst: Di Jan 16, 2018 10:15 am
von jogo
Hallo Frida,

die Namen kann man etwa so generieren:

Code: Alles auswählen

Namen <- expand.grid(cond2=c("x", "y", "z"), cond1 = c("A", "B"))
Namen$n <- paste0("Liste.", Namen$cond1, ".", Namen$cond2)
Namen
oder man spielt noch etwas rum mit:

Code: Alles auswählen

outer(FUN=paste0, c("A", "B"), c("x", "y", "z"))
bis es passt.

Für die Datenverwaltung empfehle ich wieder eine Liste von Listen. ;)

Gruß, Jörg

Re: Funktion auf Reihen eines dataframes anwenden

Verfasst: Di Jan 16, 2018 12:56 pm
von FridaKoriander
Hallo Jörg,

alles klar, cool, Danke!

Ich seh´schon, Listen sind das A und O ;-)

Besten Dank und viele Grüße
Frida

Re: Funktion auf Reihen eines dataframes anwenden

Verfasst: Di Jan 16, 2018 1:56 pm
von jogo
ja, es geht (i.d.S.) um listiges Progammieren :D

Gruß, Jörg

Re: Funktion auf Reihen eines dataframes anwenden

Verfasst: Di Jan 16, 2018 10:47 pm
von EDi
list-columns fand ich in letzter Zeit auch sehr nützlich.