我想以编程方式为dplyr::top_n
函数设置列名。
getSubset <- function(df, t, f) {
df %>%
top_n(t, wt = eval(as.name(f), envir = df))
}
data.frame(x = 1:20, y = 20:1) %>%
getSubset(10, "x")
它告诉我Error: object 'f' not found
。我尝试使用lazyeval
包,但不知怎的,我一直误解这个概念。有人能把我推向正确的方向吗?谢谢!
答案 0 :(得分:1)
您的问题是top_n
使用非标准评估。它试图在数据框eval(as.name(f), envir = df))
的上下文中评估表达式df
,并且f
在该环境中不存在。
一种解决方法是暂时将所需的wt
值添加到数据框中。
getSubset <- function(df, t, f) {
df %>%
mutate(.wt = eval(as.name(f), envir = df)) %>%
top_n(t, wt = .wt) %>%
select(-.wt)
}
data.frame(x = 1:20, y = 20:1) %>%
getSubset(10, "x")
另一种方法是使用interp
包中的lazyeval
。
getSubset <- function(df, t, f) {
call <- quote(df %>%
top_n(t, wt = .wt))
call <- interp(call, .wt = eval(as.name(f), envir = df))
eval(call)
}
data.frame(x = 1:20, y = 20:1) %>%
getSubset(10, "x")