以编程方式在dplyr :: top_n中设置列名

时间:2016-12-01 17:41:12

标签: r dplyr lazy-evaluation

我想以编程方式为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包,但不知怎的,我一直误解这个概念。有人能把我推向正确的方向吗?谢谢!

1 个答案:

答案 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")