Mehrere Ergebnisse aus einer Funktion in einen dataframe schreiben?

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

Moderatoren: EDi, jogo

Antworten
pfischer
Beiträge: 31
Registriert: Mi Mär 29, 2017 5:31 pm

Mehrere Ergebnisse aus einer Funktion in einen dataframe schreiben?

Beitrag von pfischer »

Lieber Forum,
eigentlich eine scheinbar simple Aufgabe, für die ich aber keine rechte Lösung finde. Ich habe folgende density Funktion erstellt:

Code: Alles auswählen

dmode <- function(x) {
  dxapprox <- approxfun(density(x, adjust=1, kernel = c("gaussian"), na.rm = TRUE))
  dx <- density(x, adjust=1, kernel = c("gaussian"), na.rm = TRUE)
  plot(dx)
  points(x, dxapprox(x),col=2)
  dx$x[which.max(dx$y)]
} 
Die Funktion liefert mir, wie sie soll, den "Dichteschwerpunkt eines Vektors. Ich wende die Funktion nun erfolgreich mit apply auf einen data.frame mit n columns an wobei ich zur Berechnung des Dichteschwerpunktes pro Reihe die 1. column nicht berücksichtige.

Code: Alles auswählen

selected_data$a <- apply(selected_data[,2:ncol(selected_data)],1,dmode)
Das klappt auch alles und ich habe eine neue Variable a im data.frame die mir den Dichteschwerpunkt für die jeweilige Zeile gibt.

Nun möchte ich aber pro Zeile zusätzlich zum Dichteschwerpunkt auch noch die Bandwidth der Berechnung in den Datensatz als zusätzliche Variable schreiben.

Dazu ändere ich meien Funktion wie folgt:

Code: Alles auswählen

dmode <- function(x) {
  dxapprox <- approxfun(density(x, adjust=1, kernel = c("gaussian"), na.rm = TRUE))
  dx <- density(x, adjust=1, kernel = c("gaussian"), na.rm = TRUE)
  plot(dx)
  points(x, dxapprox(x),col=2)
  dx$x[which.max(dx$y)]
  dx.list <- list(dx$x[which.max(dx$y)], dx$bw)
  return(dx.list)
} 
Wie bekomme ich nun aber die zusätzliche Variable "dx$bw" in den Datensatz. Egal was ich probiert habe, ich bekomme es einfach nicht hin. Ich bin sicher, dass es eine ganz einfache Lösung gibt die sich mir aktuell aber einfach nicht erschliessen will.

Herzlichen Dank für einen Tip
Philipp
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Mehrere Ergebnisse aus einer Funktion in einen dataframe schreiben?

Beitrag von jogo »

Hallo Philipp,

zunächst habe ich in Deiner Nachricht die Code-Stücke entsprechend formatiert.
Bitte mache das in Deinen zukünftigen Nachrichten selbst; lies viewtopic.php?f=20&t=29

Code: Alles auswählen

selected_data$a <- apply(selected_data[,2:ncol(selected_data)],1,dmode)
das geht einfacher:

Code: Alles auswählen

selected_data$a <- apply(selected_data[, -1], 1, dmode)
Bei dem anderen Problem lieferst Du pro input-Vektor eine Liste zurück. Um dann wieder an die zweiten Elemente der Liste heran zu kommen, kannst Du sapply(..., '[[', 2) drüber laufen lassen, also:

Code: Alles auswählen

Lbw <- apply(selected_data[, -1], 1, dmode)
sapply(Lbw, '[[', 2)
Ich sehe gerade, dass Du in Deiner neuen Funktion beide Werte generierst. Das macht die Sache einfacher. Du solltest einen Vektor zurückliefern:

Code: Alles auswählen

dmode <- function(x) {
  dxapprox <- approxfun(density(x, adjust=1, kernel = c("gaussian"), na.rm = TRUE))
  dx <- density(x, adjust=1, kernel = c("gaussian"), na.rm = TRUE)
  plot(dx)
  points(x, dxapprox(x),col=2)
  dx$x[which.max(dx$y)]
  c(DSP=dx$x[which.max(dx$y)], bw=dx$bw)
} 

apply(iris[1:6, -5], 1, dmode)
Mit t() und cbind() kannst Du noch etwas Kosmetik betreiben.

Gruß, Jörg
pfischer
Beiträge: 31
Registriert: Mi Mär 29, 2017 5:31 pm

Re: Mehrere Ergebnisse aus einer Funktion in einen dataframe schreiben?

Beitrag von pfischer »

Hallo Jörg,
vielen Dank für die extrem schnelle und kompetente Hilfe. Ich habe es gerade ausprobiert und alles ist genau so wie ich es mir gedacht habe. Also, ganz herzlichen Dank nochmals für die Hilfe und das nächste Mal werde ich die Codezeilen auch richtig formatieren.
Viele Grüße
Philipp
Antworten