2017-09-13 2 views
0

J'essaye d'écrire une fonction qui me permettra de produire des statistiques descriptives en regroupant plusieurs facteurs dans une trame de données. J'ai passé beaucoup trop d'heures à essayer de faire reconnaître ma fonction par les variables que je sélectionne.Ecriture d'une fonction dans R pour grouper par colonne de variables d'une trame de données

Voici les données faux:

grouping1 <- c("red", "blue", "blue", "green", "red", "blue", "red", "green")     
grouping2 <- c("high", "high", "low", "medium", "low", "high", "medium", "high")     
value <- c(22,40,72,41,36,16,88,99) 

fake_df <- data.frame(grouping1, grouping2, value) 

exemple de code faux:

library(dplyr) 

by_group_fun <- function(fun.data.in, fun.grouping.factor){ 
    fake_df2 <- fun.data.in %>% 
    group_by(fun.grouping.factor) %>% 
    summarize(mean = mean(value), median = median(value)) 
    fake_df2 
} 
by_group_fun(fake_df, grouping1) 
by_group_fun(fake_df, grouping2) 

Cela me donne:

Error in grouped_df_impl(data, unname(vars), drop) : 
    Column `fun.grouping.factor` is unknown 

Deuxième essai

J'ai essayé d'affecter la variable by sélectionnée dans la fonction à une nouvelle variable et de la reporter.

exemple de code faux (deuxième essai):

by_group_fun2 <- function(fun.data.in, fun.grouping.factor){ 
    fun.data.in$by_var <- fun.data.in$fun.grouping.factor 

    fake_df2 <- fun.data.in %>% 
    group_by(by_var) %>% 
    summarize(mean = mean(value), median = median(value)) 
    fake_df2 
} 

by_group_fun2(fake_df, grouping1) 
by_group_fun2(fake_df, grouping2) 

Cette deuxième essai, me donne:

Error in grouped_df_impl(data, unname(vars), drop) : 
    Column `by_var` is unknown 
+1

voir pour apprendre comment programmer avec 'dplyr': https: //cran.r-project.org/web/packages/dplyr/vignettes/programming.html – www

Répondre

0

Utilisez cet exemple pour vous guider

myfun <- function(df, thesecols) { 
       require(dplyr) 
       thesecols <- enquo(thesecols) # need to quote 
       df %>% 
       group_by_at(vars(!!thesecols)) # !! unquotes 
     } 

myfun(fake_df, grouping1) 

Sortie

# A tibble: 8 x 3 
# Groups: grouping1 [3] 
    grouping1 grouping2 value 
    <fctr> <fctr> <dbl> 
1  red  high 22 
2  blue  high 40 
3  blue  low 72 
4  green medium 41 
5  red  low 36 
6  blue  high 16 
7  red medium 88 
8  green  high 99 
2

Un moyen très simple d'obtenir la même sortie sans avoir recours à la programmation avec dplyr est de regrouper les colonnes de regroupement sous forme longue. Le regroupement par les deux colonnes résultantes clés et valeur obtenir toutes les combinaisons que vous demandez sans aller au-delà d'un seul data.frame:

library(tidyverse) 

fake_df <- data_frame(grouping1 = c("red", "blue", "blue", "green", "red", "blue", "red", "green"), 
         grouping2 = c("high", "high", "low", "medium", "low", "high", "medium", "high"), 
         value = c(22,40,72,41,36,16,88,99)) 

fake_df %>% 
    gather(group_var, group_val, -value) %>% 
    group_by(group_var, group_val) %>% 
    summarise(mean = mean(value), 
       median = median(value)) 
#> # A tibble: 6 x 4 
#> # Groups: group_var [?] 
#> group_var group_val  mean median 
#>  <chr>  <chr> <dbl> <dbl> 
#> 1 grouping1  blue 42.66667 40.0 
#> 2 grouping1  green 70.00000 70.0 
#> 3 grouping1  red 48.66667 36.0 
#> 4 grouping2  high 44.25000 31.0 
#> 5 grouping2  low 54.00000 54.0 
#> 6 grouping2 medium 64.50000 64.5