我有数据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任何帮助都被指向正确的方向,非常感谢。
发布于 2017-05-10 07:36:42
不需要向函数添加任何内容。只需将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发布于 2017-05-10 07:04:14
我们可以使用开发版的quosure (即将发布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的形式获得输入参数,用quo_name将quosure转换为string,创建'newName‘字符串。然后,通过取消引用( quosure或!!)来评估select/group_by/summarise内部的UQ。注意,在新版本中,我们还可以直接分配列名,并使用assign (:=)。
https://stackoverflow.com/questions/43885497
复制相似问题