dplyr - using column names as function arguments
Solution 1:
This can work using the latest dplyr
syntax (as can be seen on github):
library(dplyr)
library(rlang)
sumByColumn <- function(df, colName) {
df %>%
group_by(a) %>%
summarize(tot = sum(!! sym(colName)))
}
sumByColumn(data, "b")
## A tibble: 2 x 2
# a tot
# <int> <int>
#1 1 24
#2 2 27
And an alternative way of specifying b
as a variable:
library(dplyr)
sumByColumn <- function(df, colName) {
myenc <- enquo(colName)
df %>%
group_by(a) %>%
summarize(tot = sum(!!myenc))
}
sumByColumn(data, b)
## A tibble: 2 x 2
# a tot
# <int> <int>
#1 1 24
#2 2 27
Solution 2:
dplyr
now also provides helper functions (summarise_at
, which accepts arguments vars
, funs
) for this
sumByColumn <- function(df, colName) {
df %>%
group_by(a) %>%
summarize_at(vars(colName), funs(tot = sum))
}
provides the same answer
# A tibble: 2 x 2
# a tot
# <int> <int>
# 1 1 24
# 2 2 27
Solution 3:
We can use the .data
pronoun.
library(dplyr)
sumByColumn <- function(df, colName) {
df %>%
group_by(a) %>%
summarise(tot = sum(.data[[colName]]))
}
sumByColumn(data, "b")
# a tot
#* <int> <int>
#1 1 24
#2 2 27