0

This question is linked to this one but I cannot get it to work when I want to use multiple functions. I have a function as follows:

f3 <- function(x){
    d <- mtcars %>% group_by(cyl, gear) %>% summarize(across(all_of(x), 
                                                      m = mean(x), 
                                                      sd = sd(x),
                                                      n = length(x),
                                                      se = sd / sqrt(n),
                                                      tscore = qt(0.975, n-1),
                                                      margin = tscore * se,
                                                      uppma = mean + margin,
                                                      lowma = mean - margin),
                                                      .groups = 'drop')
 }

But when I call the function like this it doesn't work:

d <- f3(x = c('wt'))

My required output is df with columns called m, sd, n, se, tscore, margin, uppma, lowma with the result of that function across the groups I made with group_by()

user438383
  • 5,716
  • 8
  • 28
  • 43
Lieke
  • 127
  • 11
  • Will you only ever pass in one column? And you want to pass in the column name as a string (with quotes) rather than a symbol (without quotes)? – MrFlick Jul 21 '22 at 13:05
  • @MrFlick Indeed only one column. I don't need to pass the column with name as a string but I thought it was the only way - I was wrong! – Lieke Jul 21 '22 at 13:22
  • also https://stackoverflow.com/questions/48219732/pass-a-string-as-variable-name-in-dplyrfilter – user438383 Jul 21 '22 at 16:25

1 Answers1

2

You can call the function using symbols rather than strings for the column names by using the {{ ('curly curly') operator:

library(tidyverse)

f3 <- function(x){
 mtcars %>% 
    group_by(cyl, gear) %>% 
    summarize(m = mean({{x}}), 
         sd = sd({{x}}),
         n = length({{x}}),
         se = sd / sqrt(n),
         tscore = qt(0.975, n-1),
         margin = tscore * se,
         uppma = m + margin,
         lowma = m - margin,
         .groups = 'drop')
}

f3(x = wt)
#> # A tibble: 8 x 10
#>     cyl  gear     m     sd     n     se tscore  margin  uppma   lowma
#>   <dbl> <dbl> <dbl>  <dbl> <int>  <dbl>  <dbl>   <dbl>  <dbl>   <dbl>
#> 1     4     3  2.46 NA         1 NA     NaN    NaN     NaN    NaN    
#> 2     4     4  2.38  0.601     8  0.212   2.36   0.502   2.88   1.88 
#> 3     4     5  1.83  0.443     2  0.314  12.7    3.98    5.81  -2.16 
#> 4     6     3  3.34  0.173     2  0.123  12.7    1.56    4.89   1.78 
#> 5     6     4  3.09  0.413     4  0.207   3.18   0.657   3.75   2.44 
#> 6     6     5  2.77 NA         1 NA     NaN    NaN     NaN    NaN    
#> 7     8     3  4.10  0.768    12  0.222   2.20   0.488   4.59   3.62 
#> 8     8     5  3.37  0.283     2  0.2    12.7    2.54    5.91   0.829
Allan Cameron
  • 147,086
  • 7
  • 49
  • 87