Dplyr编写一个以列名作为输入的函数

时间:2015-03-13 21:43:41

标签: r dplyr

我正在编写一个函数,我将在dplyr中的多个列上使用,但是我无法将列名作为dplyr函数的输入传递。

以下是我想要做的一个例子:

df<-tbl_df(data.frame(group=rep(c("A", "B"), each=3), var1=sample(1:100, 6), var2=sample(1:100, 6)))


example<-function(colname){
  df %>%
    group_by(group)%>%
    summarize(output=mean(sqrt(colname)))%>%
    select(output)
}
example("var1")

输出应该看起来像

df %>%
  group_by(group)%>%
  summarize(output=mean(sqrt(var1)))%>%
  select(output)

我发现了一些类似的问题,但我无法直接应用于我的问题,所以任何帮助都表示赞赏。我已经尝试了一些涉及eval的解决方案,但老实说我不知道​​究竟应该传递给eval。

2 个答案:

答案 0 :(得分:4)

这是你所期望的吗?

df<-tbl_df(data.frame(group=rep(c("A", "B"), each=3), var1=sample(1:100, 6), var2=sample(1:100, 6)))

example<-function(colname){
  df %>%
    group_by(group)%>%
    summarize(output=mean(sqrt(colname)))%>%
    select(output)
}
example( quote(var1) )
#-----
Source: local data frame [2 x 1]

    output
1 7.185935
2 8.090866

答案 1 :(得分:1)

在R 3.6 / dplyr 0.8中不再接受已接受的答案。

如建议in another answer一样,您可以使用!!as.name()

这对我有用:

df<-tbl_df(data.frame(group=rep(c("A", "B"), each=3), var1=sample(1:100, 6), var2=sample(1:100, 6)))

example<-function(colname){
  df %>%
    group_by(group)%>%
    summarize(output=mean(sqrt(!!as.name(colname)))%>%
    select(output)
}
example( quote(var1) )

如果另外想要在mutate中分配要分配的列名,那么最简单的方法是使用分配:=。例如,将 colname 替换为其平方根。

example_mutate<-function(colname){
  df %>%
    mutate(!!colname := sqrt(!!as.name(colname)))
}
example_mutate( quote(var1) )

quote()当然可以用引号""代替。

相关问题