【问题标题】:Dplyr write a function with column names as inputsDplyr 编写一个以列名作为输入的函数
【发布时间】:2015-03-13 21:43:40
【问题描述】:

我正在编写一个要在 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 的确切内容。

【问题讨论】:

  • @StevenBeaupré 不,因为没有名为 var1 的对象

标签: r dplyr


【解决方案1】:

这是你所期望的吗?

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

【讨论】:

  • 是的,这是完美的。谢谢,我担心答案会复杂得多
  • 我不是 dplyr 的大用户,所以我想知道为什么需要函数 select。 (取出它似乎不会影响我完成的少量 (n=1) 测试中的行为。)
  • @BondedDust 不需要。使用summarize() 将结果折叠到output。您可以安全地删除它。
【解决方案2】:

接受的答案在 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()当然可以用引号""代替。

【讨论】:

    猜你喜欢
    • 2019-05-15
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多