我正在尝试创建一个接受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; ??
任何建议都会非常感激。
答案 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