r-dplyr过滤条件下的混合函数和参数



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

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

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)

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

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

}

我收到一个错误,"找不到函数'year'"??

如有任何建议,我们将不胜感激。

使用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

给出与上述相同的输出。

这是因为您正在创建的调用没有捕获您正在创建它的环境。最简单的修复方法是在公式上使用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

最新更新