Funktion auf Reihen eines dataframes anwenden

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

Moderatoren: EDi, jogo

Antworten
FridaKoriander
Beiträge: 37
Registriert: Do Dez 01, 2016 9:08 pm

Funktion auf Reihen eines dataframes anwenden

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Funktion auf Reihen eines dataframes anwenden

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Funktion auf Reihen eines dataframes anwenden

Beitrag 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
FridaKoriander
Beiträge: 37
Registriert: Do Dez 01, 2016 9:08 pm

Re: Funktion auf Reihen eines dataframes anwenden

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

Re: Funktion auf Reihen eines dataframes anwenden

Beitrag 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
FridaKoriander
Beiträge: 37
Registriert: Do Dez 01, 2016 9:08 pm

Re: Funktion auf Reihen eines dataframes anwenden

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

Re: Funktion auf Reihen eines dataframes anwenden

Beitrag von jogo »

ja, es geht (i.d.S.) um listiges Progammieren :D

Gruß, Jörg
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Funktion auf Reihen eines dataframes anwenden

Beitrag von EDi »

list-columns fand ich in letzter Zeit auch sehr nützlich.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Antworten