Передача имени столбца внутри функции с использованием dplyr
Мне известно об использовании lazyeval внутри функции для обращения к именам столбцов с помощью dplyr, но я застрял. В общем, при создании функции, использующей dplyr, которая также ссылается на имена столбцов из аргументов функции, какой самый идиоматичный способ добиться этого? Благодарю.
library(lazyeval)
## Create data frame
df0 <- data.frame(x=rnorm(100), y=runif(100))
##########################################
## Sample mean; this way works
##########################################
df0 %>%
filter(!is.na(x)) %>%
summarize(mean=mean(x))
##########################################
## Sample mean via function; does not work
##########################################
dfSummary2 <- function(df, var_y) {
p <- df %>%
filter(!is.na(as.name(var_y))) %>%
summarize(mean=mean(as.name(var_y)))
return(p)
}
dfSummary(df0, "x")
# mean
# 1 NA
# Warning message:
# In mean.default("x") : argument is not numeric or logical: returning NA
##########################################
## Sample mean via function; also does not work
##########################################
dfSummary <- function(df, var_y) {
p <- df %>%
filter(!is.na(var_y)) %>%
summarize(mean=mean(var_y))
return(p)
}
dfSummary(df0, "x")
# mean
# 1 NA
# Warning message:
# In mean.default("x") : argument is not numeric or logical: returning NA
2 ответа
Комментарий использовать summarize_
а также filter_
правильное направление при использовании dplyr
и больше информации доступно с vignette("nse")
,
Хотя с данной проблемой, это обеспечит функцию, которая использует переменное имя столбца без необходимости dplyr
dfSummary <- function(df, var_y) {
mean(df[[var_y]], na.rm = TRUE)
}
dfSummary(df0, "x")
[1] 0.105659
dfSummary(df0, "y")
[1] 0.4948618
summarize_
иfilter_
теперь устарели для информации. Лучше использовать
dfSummary <- function(df, var_y) {
p <- df %>%
filter(!is.na(var_y)) %>%
summarize(mean=mean({{var_y}}))
return(p)
}