我的目标是定义一些在dplyr动词中使用的函数,它们使用预定义的变量.这是因为我有一些这些函数带有一堆参数,其中许多参数都是相同的变量名.
我的理解:这很难(也许是不可能的)因为dplyr稍后会懒惰地评估用户指定的变量,但是任何默认参数都不在函数调用中,因此不可见dplyr.
考虑以下示例,我用它dplyr来计算变量是否已更改(在这种情况下相当无意义):
library(dplyr)
mtcars %>%
mutate(cyl_change = cyl != lag(cyl))
Run Code Online (Sandbox Code Playgroud)
现在,lag还支持备用排序,如下所示:
mtcars %>%
mutate(cyl_change = cyl != lag(cyl, order_by = gear))
Run Code Online (Sandbox Code Playgroud)
但是,如果我想创建自己的版本lag,总是按顺序排序gear呢?
天真的方法是这样的:
lag2 <- function(x, n = 1L, order_by = gear) lag(x, n = n, order_by = order_by)
mtcars %>%
mutate(cyl_change = cyl != lag2(cyl))
Run Code Online (Sandbox Code Playgroud)
但这显然会引发错误:
没有找到名为'gear'的对象
更现实的选择是这些,但它们也不起作用:
lag2 <- function(x, n = 1L) lag(x, n = n, order_by = ~gear) …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个函数tidyverse/dplyr,我想最终使用lapply(或map).(我一直在努力回答这个问题,但发现了一个有趣的结果/死胡同.请不要将其标记为重复 - 这个问题是你在那里看到的答案的延伸/背离.)
是否有
1)获取引用变量列表以在dplyr函数内工作
(并且不使用已弃用的SE_函数)的方法, 或者是
2)某种方式通过一个lapply或多个方式提供一个未加引号的字符串列表map
我使用Programming in Dplyr小插图来构建我认为最符合当前使用NSE标准的功能.
sample_data <-
read.table(text = "REVENUEID AMOUNT YEAR REPORT_CODE PAYMENT_METHOD INBOUND_CHANNEL AMOUNT_CAT
1 rev-24985629 30 FY18 S Check Mail 25,50
2 rev-22812413 1 FY16 Q Other Canvassing 0.01,10
3 rev-23508794 100 FY17 Q Credit_card Web 100,250
4 rev-23506121 300 FY17 S Credit_card Mail 250,500
5 rev-23550444 100 FY17 S Credit_card Web 100,250
6 rev-21508672 …Run Code Online (Sandbox Code Playgroud) 当我在R中加载一些库时,我收到以下错误:
library(预测)错误:对象'f_eval'不是由'namespace:lazyeval'导出的另外:警告消息:包'forecast'是在R版本3.3.2下构建的错误:包'或命名空间加载失败'预测'
库(tsoutliers)错误:对象'f_eval'不是由'namespace:lazyeval'导出的另外:警告消息:包'tsoutliers'是在R版本3.3.2下构建的错误:'tsoutliers'的包或名称空间加载失败
我已经尝试重新安装软件包,但它没有帮助.此外,我之前能够使用预测包,但是在安装tsoutliers包后我开始面临这个错误.
我该如何解决这个问题?
我认为这个问题有多种其他变化(例如:here,here ,也许here) - 甚至可能是某个地方的答案。
如何为过滤器函数提供参数。
library(dplyr)
library(lazyeval)
set.seed(10)
data <- data.frame(a=sample(1:10, 100, T))
Run Code Online (Sandbox Code Playgroud)
如果我需要计算数字 1 到 10 的出现次数并显示计数,比如 1、2 和 3,我会这样做:
data %>%
group_by(a) %>%
summarise(n = n()) %>%
filter(a < 4)
Run Code Online (Sandbox Code Playgroud)
给出:
# A tibble: 3 × 2
a n
<int> <int>
1 1 11
2 2 8
3 3 16
Run Code Online (Sandbox Code Playgroud)
现在,我怎样才能把它放到一个函数中?这grp是分组变量。
fun <- function(d, grp, no){
d %>%
group_by_(grp) %>%
summarise_(n = interp(~ n() )) %>%
filter_( grp < no)
# …Run Code Online (Sandbox Code Playgroud)