"summarise_at" and "mutate_if" for descriptive statistics for character variables

Viewed 753

I would like to use summarise_at and mutate_at on multiple character variables at the same time. I have looked at many examples that use integer variables, but I just can't figure it out for character variables. Directly below is the code I use to produce descriptive statistics for a character (or factor) variable.

library(tidyverse)

# First block of code
starwars %>%
  group_by(gender) %>%
  summarise (n = n()) %>%
  mutate(totalN = (cumsum(n))) %>%
  mutate(percent = round((n / sum(n)), 3)) %>%
  mutate(cumpercent = round(cumsum(freq = n / sum(n)),3))

This produces:

A tibble: 5 x 5
         gender     n totalN percent cumpercent
          <chr> <int>  <int>   <dbl>      <dbl>
1        female    19     19   0.218      0.218
2 hermaphrodite     1     20   0.011      0.230
3          male    62     82   0.713      0.943
4          none     2     84   0.023      0.966
5          <NA>     3     87   0.034      1.000

I would like to produce this same thing, but for multiple character (or factor) variables at once. In this case, let's use the variables gender and eye_color This is what I have tried:

starwars %>%        
      summarise_at(vars(gender, eyecolor) (n = n()) %>%
      mutate_at(vars(gender, eyecolor) (totalN = (cumsum(n))) %>%
      mutate_at(vars(gender", "eyecolor) (percent = round((n / sum(n)), 3)) %>%
      mutate_at(vars(gender, eyecolor) (cumpercent = round(cumsum(freq = n / sum(n)),3))))))

I get the following error:

Error in eval(expr, envir, enclos) : attempt to apply non-function

I understand that there are built-in functions called using funs, but I don't want to use them. I have tried playing with the code in many different ways to get it to work, but have come up short.

What I would like to produce, is something like this:

A tibble: 5 x 5
         gender     n totalN percent cumpercent
          <chr> <int>  <int>   <dbl>      <dbl>
1        female    19     19   0.218      0.218
2 hermaphrodite     1     20   0.011      0.230
3          male    62     82   0.713      0.943
4          none     2     84   0.023      0.966
5          <NA>     3     87   0.034      1.000

A tibble: 15 x 5
      eye_color     n totalN percent cumpercent
          <chr> <int>  <int>   <dbl>      <dbl>
1         black    10     10   0.115      0.115
2          blue    19     29   0.218      0.333
3     blue-gray     1     30   0.011      0.345
4         brown    21     51   0.241      0.586
5          dark     1     52   0.011      0.598
6          gold     1     53   0.011      0.609
7 green, yellow     1     54   0.011      0.621
8         hazel     3     57   0.034      0.655
9        orange     8     65   0.092      0.747
10         pink     1     66   0.011      0.759
11          red     5     71   0.057      0.816
12     red, blue    1     72   0.011      0.828
13       unknown    3     75   0.034      0.862
14         white    1     76   0.011      0.874
15        yellow    11     87   0.126     1.000

Perhaps a loop would be better? Right now I have many lines of code to generate the descriptive statistics for each character variable because I have to run the first block of code (noted above) for each variable. It would be great if I could just list the variables I would like to use and run each through the first block of code.

1 Answers
Related