首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dplyr和lazyeval与“.”

使用dplyr和lazyeval与“.”
EN

Stack Overflow用户
提问于 2015-09-17 08:22:23
回答 1查看 416关注 0票数 10

简化编辑:

归根结底是这样:

代码语言:javascript
复制
df = data.frame(a = 1:10)

#example function that takes optional arguments
mymean <- function(x, w = 1, s = 0) { s + mean(w * x) }

summarize_(df, m = "mean(a)")
#>     m
#> 1 5.5

summarize_(df, m = "mymean(a)")
#> Error: could not find function "mymean"

根据‘`vignette("nse")的说法,summarize_在使用非标准的总结函数时必须给出公式语法。

最终,我希望能够将summarize_封装在这样的函数中:

代码语言:javascript
复制
my_summary <- function(df, x, ...) {
  summarize_(df, 
             m = "mean(a)",
             wm = "mymean(a, ...)" #gives error 
}

#Partial working function
my_summary <- function(df, x, ...) {
  summarize_(df, 
             m = "mean(a)", #works
             wm1 = interp(mymean(a), a = as.name(x) #works but doesn't  allow ... 
             wm2 = interp(mymean(a, b), 
                          .values=list(a = as.name(x),
                                       b = quote(...)),  #doesn't work
             wm3 = interp(mymean(a, ...), a = as.name(x) #doesn't work
}

一个工作职能可以让我打电话给:

代码语言:javascript
复制
my_summary(df, a)
#> 5.5

my_summary(df, a, w=5, s=2)
#> 29.5
EN

回答 1

Stack Overflow用户

发布于 2015-09-17 18:15:56

这个非常烦人的、可怕的函数能起作用,但是如果mymean包含许多可选的参数呢?

代码语言:javascript
复制
mymean <- function(x, w=1, s = 0) { s + mean(w * x) }

my_summarize <- function(df, x, ...) {
  vlist = list(...)
  vlist_names = names(vlist)
  if ("w" %in% vlist_names & "s" %in% vlist_names) {
    res = summarize_(df, m = interp(~mymean(a, w=b, s=c), 
                                    .values = list(a = as.name(x),
                                                   b = vlist$w,
                                                   c = vlist$s)))
  }
  else if ("w" %in% vlist_names) {
    res = summarize_(df, m = interp(~mymean(a, w=b), 
                                    .values = list(a = as.name(x),
                                                   b = vlist$w)))
  }
  else if ("s" %in% vlist_names) {
    res = summarize_(df, m = interp(~mymean(a, s=c), 
                                    .values = list(a = as.name(x),
                                                   c = vlist$s)))
  }
  else {
    res = summarize_(df, m = interp(~mymean(a), a = as.name(x)))
  }
  res    
}


df = data.frame(a = 1:10)

my_summarize(df, "a")
#>     m
#> 1 5.5
my_summarize(df, "a", s=5)
#>      m
#> 1 10.5
my_summarize(df, "a", w=2)
#>    m
#> 1 11
my_summarize(df, "a", w=2, s=5)
#>    m
#> 1 16
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32625620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档