r - dplyr summarise_评估不规范导致结果不同

标签 r dplyr

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

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 

最佳答案

我们可以使用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

我们可以通过使用函数名称作为参数来使用单个函数来执行平均值中位数等。

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

关于r - dplyr summarise_评估不规范导致结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32340448/

相关文章:

javascript - 我怎样才能制作这样的情节?

r - 提取行号以匹配索引 R 不起作用

r - 将数据从多行转换为多列

r - 为什么有时我必须将 `.` 包含在 `data.frame()` 中,以便为 `do` 中的命名参数?

r - dplyr Mutate 中的错误 - 遍历列以生成图形

r - mutate 函数没有更新

r - 使用OR使用dplyr过滤数据帧的更好方法?

r - 合并向量;奇数位置和偶数位置

r - Shiny 的渲染UI错误

R Shiny 令人费解的警告 : Input to asJSON(keep_vec_names=TRUE) is a named vector