Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dplyr编写一个以列名作为输入的函数_R_Dplyr - Fatal编程技术网

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

Dplyr编写一个以列名作为输入的函数,r,dplyr,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)%>% su

我正在编写一个函数,我将在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")

我发现了一些类似的问题,但没有什么可以直接应用到我的问题上,所以非常感谢您的帮助。我尝试了一些涉及eval的解决方案,但我真的不知道我应该传递给eval的确切内容。

这是您所期望的吗

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
df%
汇总(输出=平均值(sqrt(colname)))%>%
选择(输出)
}
示例(引用(var1))
#-----
来源:本地数据帧[2 x 1]
输出
1 7.185935
2 8.090866

在R3.6/dplyr 0.8中,接受的答案不再有效

根据建议,可以使用
!!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) )


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

是的,这很完美。谢谢,我担心答案会复杂得多。我不是一个大的dplyr用户,所以我想知道为什么需要函数
select
。(在我做过的少量(n=1)测试中,取出它似乎不会影响行为。)@BondedDust不需要它。使用
summary()。您可以安全地删除它。@StevenBeaupréno,因为没有名为var1的对象
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) )

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