Seite 1 von 1

dplyr, function, length und NAs

Verfasst: Do Jul 06, 2023 8:57 pm
von Juergen
Hallo Leute,
ich bin neu hier und habe gerade ein kleines Problem mit den o.g. Stichpunkten. Ich habe mehrere (4) data.frame mit 12-15 cols und 500 rows und möchte jeweils 1-2 Tabellen mit den statistischen "Grunddaten" (n, mean, sd, var, q0,025, q0,05 q1, median ...) erstellen. Die cols sind unterschiedlich lange Messreihen. Leider kann ich innerhalb der von mir geschriebenen Funktion die length nicht ohne NAs auslesen. Wo habe ich was übersehen, bin falsch abgebogen, ...?
VG juergen

Code: Alles auswählen

##### Fehler bei dplyr, function, length, rm.na####

####       Erzeugen Vectoren und DF
a<- rpois(n=10, lambda=8.5) #Vector erzeugen
b<- rpois(n=10, lambda=10.5) #Vector erzeugen
b[6]<-NA     # Werte durch NAs ersetzen
b[8:10]<-NA # Werte durch NAs ersetzen

#### data.frame erzeugen
DF.zu <- data.frame(a, b ) 

###Test
length(b) # 10 "falsch"
length(b[!is.na(b)]) # 6 gewünschter Wert

####         Auswertung
library(dplyr)

FUNC.summarystats <- function(DF.zu){
  DF.SUMMERY <-data.frame(
    n      = sapply(DF.zu, length), # hier funktioniert na.rm =TRUE nicht
    mean   = sapply(DF.zu, mean, na.rm =TRUE )
    #sd , var, median, ...
  )
  return(DF.SUMMERY) 
}
### Ansicht
FUNC.summarystats(DF.zu) # n=10 fuer b ist ja falsch

Re: dplyr, function, length und NAs

Verfasst: Do Jul 06, 2023 9:33 pm
von EDi
Hier mal einpaar Ideen:

Code: Alles auswählen

length(na.omit(b))
length(b[!is.na(b)])
sum(!is.na(b))

Re: dplyr, function, length und NAs

Verfasst: Do Jul 06, 2023 9:35 pm
von EDi
In deiner Function könnte das dann so aussehen:

Code: Alles auswählen

FUNC.summarystats <- function(DF.zu){
  DF.SUMMERY <-data.frame(
    n      = sapply(DF.zu, \(x) length(x[!is.na(x)])), 
    mean   = sapply(DF.zu, mean, na.rm =TRUE )
    #sd , var, median, ...
  )
  return(DF.SUMMERY) 
}

Re: dplyr, function, length und NAs

Verfasst: Do Jul 06, 2023 10:15 pm
von Juergen
Hallo,
danke,
verdammt seid ihr hier schnell.
"\x" verstehe ich zwar noch nicht aber..
mit x ersetzt du die Variable von "length(x)" und dann kann man wieder die Optionen von "length" mitgeben, die ja scheinbar innerhalb der "function" nicht zur Verfügung stehen?

Vielen Dank das funktioniert wie gewünscht!
VG juergen

Re: dplyr, function, length und NAs

Verfasst: Fr Jul 07, 2023 12:40 am
von EDi
"\x" verstehe ich zwar noch nicht aber..
\(x) ist nur die Kurzform from function(x), siehe

Code: Alles auswählen

?`function`
Mann kann an sapply ein beliebige funktion übergeben. Hier eine sogenannte "anoynme" function weil sie nur im sapply aufruf lebt (und keinen Namen hat wie z.B: length weil sie nicht vorher definiert wurde).

Code: Alles auswählen

sapply(DF.zu, length)
und

Code: Alles auswählen

sapply(DF.zu, \(x) length(x) )
sind das geiche, nur gibt mir letzere mehr flexibilität weil ich in funktionen alles anstellen mit meinen Objekten kann.

Nennt sich dann "Funktionales Programmieren" und R ist sehr gut darin (Auch im Meta-programming btw).

Re: dplyr, function, length und NAs

Verfasst: Fr Jul 07, 2023 6:19 am
von Juergen
Danke für die schnelle Hilfe und auch für die gute Erklärung.

Re: dplyr, function, length und NAs

Verfasst: Do Jul 27, 2023 7:41 pm
von bigben
Trivia: Der Backslash an dieser Stelle ist am ehesten aus der Sprache Haskell übernommen, wo er stellvertretend für ein kleines Lambda (λ) eingesetzt wurde. Ich glaube, man kann Haskell inzwischen in utf-8 programmieren und ein echtes λ im Code verwenden. Das möchte ich in R auch können!

LG, Bernhard