试图了解dplyr使用的非标准评估,但没有成功.我想要一个简短的函数,它返回一组指定变量的汇总统计数据(N,mean,sd,median,IQR,min,max).
我的功能的简化版本......
my_summarise <- function(df = temp,
to.sum = 'eg1',
...){
## Summarise
results <- summarise_(df,
n = ~n(),
mean = mean(~to.sum, na.rm = TRUE))
return(results)
}
Run Code Online (Sandbox Code Playgroud)
并使用一些虚拟数据运行它...
set.seed(43290)
temp <- cbind(rnorm(n = 100, mean = 2, sd = 4),
rnorm(n = 100, mean = 3, sd = 6)) %>% as.data.frame()
names(temp) <- c('eg1', 'eg2')
mean(temp$eg1)
[1] 1.881721
mean(temp$eg2)
[1] 3.575819
my_summarise(df = temp, to.sum = 'eg1')
n mean
1 100 NA
Run Code Online (Sandbox Code Playgroud)
计算N,但均值不计算,无法弄清楚原因.
最终,我希望我的功能更加通用,沿着...的路线.
my_summarise <- function(df = temp,
group.by = 'group'
to.sum = c('eg1', 'eg2'),
...){
results <- list()
## Select columns
df <- dplyr::select_(df, .dots = c(group.by, to.sum))
## Summarise overall
results$all <- summarise_each(df,
funs(n = ~n(),
mean = mean(~to.sum, na.rm = TRUE)))
## Summarise by specified group
results$by.group <- group_by_(df, ~to.group) %>%
summarise_each(df,
funs(n = ~n(),
mean = mean(~to.sum, na.rm = TRUE)))
return(results)
}
Run Code Online (Sandbox Code Playgroud)
...但在我进入这个更复杂的版本(我使用这个例子作为指导)之前,我需要首先在简单版本中进行评估,因为那是绊脚石,调用dplyr::select()工作正常.
感谢任何关于我出错的建议.
提前致谢
基本的想法是你必须自己构建适当的调用,最容易使用lazyeval包完成.
在这种情况下,您希望以编程方式创建一个看起来像的调用~mean(eg1, na.rm = TRUE).这是如何:
my_summarise <- function(df = temp,
to.sum = 'eg1',
...){
## Summarise
results <- summarise_(df,
n = ~n(),
mean = lazyeval::interp(~mean(x, na.rm = TRUE),
x = as.name(to.sum)))
return(results)
}
Run Code Online (Sandbox Code Playgroud)
这是我努力工作的时候所做的事情:
~n()你已经拥有的那样,电话必须以a开头~.~mean(eg1, na.rm = TRUE)).lazyeval::interp重现这一号召,并通过运行仅检查这个interp直观地看到它在做什么.在这种情况下,我可能经常写interp(~mean(x, na.rm = TRUE), x = to.sum).但是运行它会使我们~mean("eg1", na.rm = TRUE)将eg1字符视为字符而不是变量名称.所以我们使用as.name,正如我们所教导的那样vignette("nse").