Variable auswählen in Datensatz

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

Moderatoren: EDi, jogo

Antworten
gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

Variable auswählen in Datensatz

Beitrag von gming11 »

Ich habe eine Frage für einen Datensatz und die Auswahl von Variablen.

Angenommen ich habe:

Code: Alles auswählen

Var1 <- c(1,2,3)
Var2 <- c(4,5,6)
Var3 <- c(7,8,9)
Data <- data.frame(Var1,Var2,Var3)
Nun nöchte ich eine Funktion basteln, die mir n und den Mittelwert der i-ten Variable ausrechnet mit der Gruppierungsvariable Var3

Code: Alles auswählen

f_x <- function(i){
  group_by(Data,Var3) %>%
    summarize(count = n(),
              mean = mean(Data[,i]), na.rm = TRUE))}

f_x(1)
Dies funktioniert leider nicht, manuell wenn ich statt Data[,i] die Variable Var1 oder Var2 eingeben funktioniert es. Was stimmt an der Syntax nicht?
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Variable auswählen in Datensatz

Beitrag von jogo »

Hallo gming,
gming11 hat geschrieben: Do Mai 06, 2021 11:38 am Ich habe eine Frage für einen Datensatz und die Auswahl von Variablen.

Angenommen ich habe:

Code: Alles auswählen

Var1 <- c(1,2,3)
Var2 <- c(4,5,6)
Var3 <- c(7,8,9)
Data <- data.frame(Var1,Var2,Var3)
dies erzeugt 4 Objekte. Ich würde das so machen:

Code: Alles auswählen

Data <- data.frame(Var1= c(1,2,3), Var2= c(4,5,6), Var3= c(7,8,9))
... manuell wenn ich statt Data[,i] die Variable Var1 oder Var2 eingeben funktioniert es.
Kannst Du bitte diesen Teil nochmal als Code zeigen?

Gruß, Jörg
gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

Re: Variable auswählen in Datensatz

Beitrag von gming11 »

Hallo,

ja einfach:

Code: Alles auswählen

f_x <- function(i){
  group_by(Data,Var3) %>%
    summarize(count = n(),
              mean = mean(Var1, na.rm = TRUE))}

f_x(1)
nun soll ich statt var1 aber durch die Funktion mittels 1 oder 2 jeweils Var1 oder Var2 auswählen.

Danke dir!
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Variable auswählen in Datensatz

Beitrag von jogo »

Hallo gming,

gehört das na.rm=TRUE zum Aufruf von mean() ?
Dann stimmt bei

Code: Alles auswählen

group_by(Data,Var3) %>%
    summarize(count = n(), mean = mean(Data[,i]), na.rm = TRUE))
etwas nicht.
... und wenn ich richtig zähle, hast Du eine schließende Klammer zuviel.
Gab es denn keine entsprechende Fehlermeldung?

Dein Datenbeispiel ist auch nicht recht günstig, weil eine Gruppierung nach $Var3 alles in einzelne Beobachtungen auflöst.

Aber ich glaube, ich weiß, was Du meinst. Auch dies funktioniert nicht:

Code: Alles auswählen

f_x2 <- function(i){
  group_by(Data,Var3) %>%
    summarize(count = n(),
              mean = mean(Data$Var1, na.rm = TRUE))}

f_x2(1)
Wahrscheinlich liegt es daran, was group_by() und summarize() machen -- das ist so tiefgreifend in der inneren Organisation des Ablaufs, dass man nicht einfach bei summarize() die Varaiblen on-the-fly tauschen kann.

Ein work-around:

Code: Alles auswählen

f_x2 <- function(i) {
  Data$neuX <- Data[, i]
  Data %>% group_by(Var3) %>%
    summarize(count = n(), mean = mean(neuX, na.rm = TRUE))
}

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

Re: Variable auswählen in Datensatz

Beitrag von EDi »

Das ist bekannt? https://dplyr.tidyverse.org/articles/programming.html

Also

Code: Alles auswählen

function(data, var = NULL){

  data %>%
  group_by(Var3) %>%
    summarize(count = n(),
              mean = mean( {{ var }}, na.rm = TRUE)
      )
  }
Man kann wunderbar mit dplyr programmieren, aber es braucht etwas mehr als Standard-R (wobei programmieren mit subset() ähnlich schwer wäre...)
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.
gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

Re: Variable auswählen in Datensatz

Beitrag von gming11 »

Hallo euch beiden, super danke die Option mit dplyr ist echt sehr gut! Danke dafür EDI ! Und auch danke jogo mir ist nun klar, warum das nicht funktioniert, und nicht zum gewünschten Output führt.

Liebe Grüße
Antworten