首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用函数论证设置列名

如何利用函数论证设置列名
EN

Stack Overflow用户
提问于 2017-05-10 06:58:47
回答 2查看 86关注 0票数 2

我有数据df,如下所示:

代码语言:javascript
复制
df <- data.frame(x = c("A", "A", "B", "B"), y = 1:4)

我有一个函数,它可以找到yx分组的平均值。

代码语言:javascript
复制
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()的第一个参数来反映实际的函数参数(也就是说,它可以用于不同的数据)。

期望的功能:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-10 07:36:42

不需要向函数添加任何内容。只需将paste0("y", ".mean")替换为paste0(deparse(substitute(y)), ".mean")

现在,函数和输出将是:

代码语言:javascript
复制
> 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
票数 1
EN

Stack Overflow用户

发布于 2017-05-10 07:04:14

我们可以使用开发版的quosure (即将发布0.6.0)。

代码语言:javascript
复制
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

我们以quosureenquo的形式获得输入参数,用quo_name将quosure转换为string,创建'newName‘字符串。然后,通过取消引用( quosure!!)来评估select/group_by/summarise内部的UQ。注意,在新版本中,我们还可以直接分配列名,并使用assign (:=)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43885497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档