2015-12-09 62 views
1

我想創建一個函數,它將接受data.frame和一個表示特定年份(如2015)的值的整數。該函數然後將使用Dplyr並返回一個過濾的數據集。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) 

}

我得到一個錯誤,「無法找到函數'年'」?

任何建議將非常感激。

回答

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 
1

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

給出與上面相同的輸出。