2017-07-03 3 views
1

J'essaye d'écrire une fonction R pour produire une table de fréquence afin que je puisse standardiser le formatage etc. sans le taper de manière répétée. Le seul problème est que je ne peux pas l'obtenir pour évaluer correctement une variable de regroupement.Fonction n'évaluant pas les variables d'une manière attendue

Voici un code pour obtenir un mini-jeu de données pour reproduire le problème:

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") 

qui se traduit par:

Erreur dans resolve_vars (new_groups, tbl_vars (.data)): inconnu variables au groupe par champ appelé à partir de: resolve_vars (new_groups, tbl_vars (.data))

J'AVONS aussi essayé:

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) 
} 

Ce qui fonctionne un peu mieux (en ce qu'elle ne fait pas d'erreur), mais n'a toujours pas réellement groupe les facteurs correctement, cette sortie:

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

Lorsqu'il dit juste moi le nombre de cas dans cette colonne. Est-ce que quelqu'un sait où je vais mal ici?

+1

vérifier la "programmation avec dplyr vignette": https://cran.r-project.org/web/packages/dplyr /vignettes/programming.html – sinQueso

Répondre

1

Désolé - je n'ai trouvé que ça.

group_by_(field)

Je pensais que cela pourrait avoir quelque chose à voir avec l'évaluation non standard, mais je ne suis pas trop bien informé à ce sujet encore.

Ce:

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) 
+ } 

donne maintenant ceci:

> 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

Comment avez-vous découvert que cela fonctionnerait avec 'paste'? avec 'as.character' il ne le fait pas –

+1

Eh bien j'ai suspecté du message d'erreur qu'il évaluait le nom de variable comme valeur, et j'ai pensé que peut-être si j'employais coller cela produirait la valeur dans l'espace dont j'avais besoin. – Nick

+0

c'est un truc cool, je me demande si cela fonctionne dans d'autres fonctions comme agrégat, qui prennent aussi des noms statiques en entrée. Je préparais une réponse où je rebaptisais la colonne avant, puis après ... Si quelqu'un peut expliquer ce qui se passe, je serai heureux! –