我的数据框df
如下:
df <- data.frame(x = c("A", "A", "B", "B"), y = 1:4)
我有一个函数可以找到按y
分组的x
的平均值:
generateVarMean <- function(df, x, y) {
mean.df <- df %>%
select(x, y) %>%
group_by(x) %>%
dplyr::summarise(variable.mean = mean(y, na.rm = TRUE))
colnames(mean.df)[2] <- paste0("y", ".mean")
print(mean.df)
}
但是,我希望paste0()
的第一个参数反映实际的函数参数(即,它可以用于不同的数据帧)。
所需功能:
df1 <- data.frame(a = c("A", "A", "B", "B"), b = 1:4)
generateVarMean(df1, a, b)
a b.mean
1 A 1.5
2 B 3.5
非常感谢任何指向正确方向的帮助。
答案 0 :(得分:2)
我们可以使用quosure
的devel版本中的dplyr
(即将发布0.6.0
)
generateVarMean <- function(df, x, y) {
x <- enquo(x)
y <- enquo(y)
newName <- paste0(quo_name(y), ".mean")
df %>%
select(UQ(x), UQ(y)) %>%
group_by(UQ(x)) %>%
summarise(UQ(newName) := mean(UQ(y), na.rm = TRUE))
}
generateVarMean(df1, a, b)
# A tibble: 2 × 2
# a b.mean
# <fctr> <dbl>
#1 A 1.5
#2 B 3.5
我们使用quosure
将输入参数作为enquo
,将quosure转换为带quo_name
的字符串以创建'newName'字符串。然后,通过取消引用(quosure
或select/group_by/summarise
)评估UQ
内的!!
。请注意,在新版本中,我们还可以直接分配列名称并使用assign运算符(:=
)
答案 1 :(得分:1)
无需向函数添加任何内容。只需将paste0("y", ".mean")
替换为paste0(deparse(substitute(y)), ".mean")
所以现在函数和输出将是:
> generateVarMean <- function(df, x, y) {
mean.df <- df %>%
select(x, y) %>%
group_by(x) %>%
dplyr::summarise(variable.mean = mean(y, na.rm = TRUE))
colnames(mean.df)[2] <- paste0(deparse(substitute(y)), ".mean")
print(mean.df)
}
> generateVarMean(df, a, b)
# A tibble: 2 × 2
x b.mean
<fctr> <dbl>
1 A 1.5
2 B 3.5