【问题标题】:Non standard evaluation of dplyr summarise_ leads to different resultsdplyr summarise_的非标准评估导致不同的结果
【发布时间】:2015-09-01 20:36:55
【问题描述】:

我想在我的函数中调用dplyr 包中的summarise_,这是我尝试过的,但我对meanmedian 函数有所不同,我的方法有什么问题?

library(dplyr)
df <- data.frame(A=c(1,2,3))
getMean <- function(df, col) {
  col <- as.symbol(col)
  df %>%
    summarise_(Mean = ~mean(col))
}

getMedian <- function(df, col) {
  col <- as.symbol(col)
  df %>%
    summarise_(Median = ~median(col))
}

getMean(df, 'A')
   Mean
1    2

getMedian(df, 'A')
Error: object 'A' not found 

【问题讨论】:

  • medianmean 的处理方式不同的原因是 mean(以及 summinmaxvarsdsummarise 操作将它们视为特殊情况,该操作为它们中的每一个调用一个 C++ 快捷方式。您可以找到该函数列表here

标签: r dplyr


【解决方案1】:

我们可以使用lazyeval

library(lazyeval)
library(dplyr)
getMedian <- function(df, col) {
          df %>%
           summarise_(.dots= list(Median=interp(~median(v), v= as.name(col))))
    }

getMedian(df, 'A')
#  Median
#1      2

我们可以使用单个函数来执行meanmedian 等,通过使用函数名称作为参数。

getFun <- function(df, col, func) {
      FUN <- match.fun(func)
      nm1 <- sub('^(.)', '\\U\\1', substitute(func), perl=TRUE)
      df %>%
        summarise_(interp(~FUN(v), v= as.name(col)))%>%
        setNames(., nm1)
}

getFun(df, 'A', median)
#  Median
#1      2
getFun(df, 'A', mean)
#  Mean
#1    2

getFun(df, 'A', var)
#  Var
#1   1

getFun(df, 'A', min)
#  Min
#1   1
getFun(df, 'A', max)
#  Max
#1   3

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 2015-11-12
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2015-03-10
    • 1970-01-01
    相关资源
    最近更新 更多