在dplyr过滤条件下混合功能和参数

时间:2015-12-09 22:10:59

标签: r function parameters dplyr

我正在尝试创建一个接受data.frame的函数和一个表示特定年份(例如2015)的值的整数。然后,该函数将使用Dplyr并返回已过滤的数据集。

以下是一些测试数据,库和非参数化的dplyr调用:

UNWIND range(0, 100000) as x
with toFloat(x) as x
return min(x),max(x),count(x),sum(x),avg(x),sum(x) / count(x)

现在,以下是我尝试将此功能封装到一个函数中:

library(dplyr)
library(lazyeval)
library(lubridate

vct_dates <- c("2015-04-30", "2015-04-30", "2012-04-30", "2010-04-30")
vct_numbers <- c(21, 45, 103, 214)
df_test <- data.frame(date = vct_dates, value = vct_numbers)

df_test %>% filter(year(date) == 2015)

}

我收到的错误是“#34;找不到功能&#39;年份&#39; &#34; ??

任何建议都会非常感激。

2 个答案:

答案 0 :(得分:2)

使用filter代替filter_,如下所示:

filter_year <- function(data, intYear) filter(data, year(date) == intYear)

filter_year(df_test, 2015) # test

,并提供:

        date value
1 2015-04-30    21
2 2015-04-30    45

如果想要将条件分开,那么如果您将year = year添加到interp,您的代码就会有效:

fn_filter_year <- function(df_data, intYear) {
    condition <- interp(quote(year(x) == y), x = as.name("date"), y = intYear, year = year)
    df_data %>% filter_(condition)
}

fn_filter_year(df_test, 2015) # test

给出与上面相同的输出。

答案 1 :(得分:0)

这是因为您正在创建的呼叫未捕获您正在创建它的环境。最简单的解决方法是在公式而不是调用上使用interp(),因为公式会保留其环境。你可以使用

fn_filter_year <- function(df_data, intYear) {
    filter_condition <- interp(~year(x) == y, x=as.name("date"), y = intYear)
    df_data %>% filter_(filter_condition)
}

fn_filter_year(df_test, 2015)
#         date value
# 1 2015-04-30    21
# 2 2015-04-30    45