2017-07-03 1 views
1

Ich versuche, eine R-Funktion zu erstellen, um eine Häufigkeitstabelle zu erstellen, damit ich Formatierung usw. standardisieren kann, ohne es wiederholt eingeben. Das einzige Problem ist, dass ich es nicht bekommen kann, um eine Gruppierungsvariable richtig auszuwerten.Funktion nicht Variablen in einer erwarteten Weise

Hier einige Code ein Mini-Datensatz zu erhalten, das Problem zu reproduzieren:

library(tidyverse) 
id <- sample(1:500, 5) 
factors <- sample(1:3, 5, replace = TRUE) 
data <- data.frame(id, factors) 
freqTable <- function(x, field){ 

    Table <- x %>% 
     group_by(field) %>% 
     summarise(N = n(), Percent = n()/NROW(x)*100) %>% 
     mutate(C.Percent = cumsum(Percent)) 
    return(Table) 
} 
freqTable(data, "factors") 

was zur Folge hat:

Fehler in resolve_vars (new_groups, tbl_vars (.data)): unbekannt Variable Gruppe von: Feld Called aus: resolve_vars (new_groups, tbl_vars (.data))

ich habe auch versucht:

freqTable <- function(x, field){ 
    Table <- x %>% 
      group_by(paste(field)) %>% 
      summarise(N = n(), Percent = n()/NROW(x)*100) %>% 
      mutate(C.Percent = cumsum(Percent)) 
    return(Table) 
} 

die ein wenig besser (in, dass es nicht Fehler) funktioniert, aber noch nicht Gruppe tatsächlich die korrekten Faktoren, die Ausgabe folgendermaßen aus:

# A tibble: 1 × 4 
    `paste(field)`  N Percent C.Percent 
      <chr> <int> <dbl>  <dbl> 
1  factors  5  100  100 

Wo es sagt nur mir die Anzahl der Fälle in dieser Spalte. Weiß jemand wo ich hier falsch liege?

+1

überprüfen Sie die "Programmierung mit dplyr Vignette" out: https://cran.r-project.org/web/packages/dplyr /vignettes/programming.html – sinQueso

Antwort

1

Entschuldigung - habe gerade dieses eine herausgefunden.

group_by_(field)

Ich dachte, es hat etwas mit Nicht-Standard-Auswertung zu tun haben könnte, aber ich bin darüber noch nicht allzu gut informiert.

Dies:

freqTable <- function(x, field){ 
+  Table <- x %>% 
+    group_by_(paste(field)) %>% 
+    summarise(N = n(), Percent = n()/NROW(x)*100) %>% 
+    mutate(C.Percent = cumsum(Percent)) 
+ return(Table) 
+ } 

Jetzt ergibt dies:

> freqTable(data, "factors") 
# A tibble: 2 × 4 
    factors  N Percent C.Percent 
    <int> <int> <dbl>  <dbl> 
1  2  2  40  40 
2  3  3  60  100 
+0

Wie hast du herausgefunden, dass es mit 'Paste' funktionieren würde? mit 'as.character' tut es nicht –

+1

Nun vermutete ich von der Fehlermeldung, dass es den Variablennamen als Wert auswertete, und dachte, dass wenn ich Paste verwenden würde, würde es den Wert in den Raum ausgeben, den ich brauchte. – Nick

+0

das ist ein cooler Trick, ich frage mich, ob es in anderen Funktionen wie Aggregat funktioniert, die auch statische Namen als Eingabe verwenden. Ich bereitete eine Antwort vor, in der ich die Kolumne umbenannte, bevor dann ... Wenn jemand erklären kann, was vor sich geht, werde ich froh sein! –

Verwandte Themen