【发布时间】:2016-06-14 15:11:23
【问题描述】:
我正在尝试做一些参数化的dplyr 操作。表达问题根源的最简单的可重现示例是这样的:
# Data
test <- data.frame(group = rep(1:5, each = 2),
value = as.integer(c(NA, NA, 2, 3, 3, 5, 7, 8, 9, 0)))
> test
group value
1 1 NA
2 1 NA
3 2 2
4 2 3
5 3 3
6 3 5
7 4 7
8 4 8
9 5 9
10 5 0
# Summarisation example, this is what I'd like to parametrise
# so that I can pass in functions and grouping variables dynamically
test.summary <- test %>%
group_by(group) %>%
summarise(group.mean = mean(value, na.rm = TRUE))
> test.summary
Source: local data frame [5 x 2]
group group.mean
<int> <dbl>
1 1 NaN
2 2 2.5
3 3 4.0 # Correct results
4 4 7.5
5 5 4.5
这就是我一个人走了多远
# This works fine, but notice there's no 'na.rm = TRUE' passed in
doSummary <- function(d_in = data, func = 'mean', by = 'group') {
# d_in: data in
# func: required function for summarising
# by: the variable to group by
# NOTE: the summary is always for the 'value' column in any given dataframe
# Operations for summarise_
ops <- interp(~f(value),
.values = list(f = as.name(func),
value = as.name('value')))
d_out <- d_in %>%
group_by_(by) %>%
summarise_(.dots = setNames(ops, func))
}
> doSummary(test)
Source: local data frame [5 x 2]
group mean(value)
<int> <dbl>
1 1 NA
2 2 2.5
3 3 4.0
4 4 7.5
5 5 4.5
尝试使用“na.rm”参数
# When I try passing in the 'na.rm = T' parameter it breaks
doSummary.na <- function(d_in = data, func = 'mean', by = 'group') {
# Doesn't work
ops <- interp(~do.call(f, args),
.values = list(f = func,
args = list(as.name('value'), na.rm = TRUE)))
d_out <- d_in %>%
group_by_(by) %>%
summarise_(.dots = setNames(ops, func))
}
> doSummary.na(test)
Error: object 'value' not found
非常感谢您的帮助!
【问题讨论】:
-
而
interp来自...? -
@pfabri 缺少的关键信息是
interp()来自包lazyeval,还有其他同名的函数,例如在akima中 -
@pfabri 我不知道以下内容是否适用于您的情况,尽管它不能直接回答您的问题
interp(~do.call(f,args), .values = list(f = 'mean',args=list(na.rm=TRUE)))。 -
@pfabri
interp(~do.call(f,args), .values = list(f = 'mean',args=list(steps, na.rm=TRUE))) -
我已经实施了所有建议的更改,并将问题重写为完全可重现但简洁(我希望如此)。
标签: r lazy-evaluation nse lazyeval