如何使用函数参数设置列名

时间:2017-05-10 06:58:48

标签: r

我的数据框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

非常感谢任何指向正确方向的帮助。

2 个答案:

答案 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'字符串。然后,通过取消引用(quosureselect/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