为什么一个命令在R中的管道操作符中不起作用,但在管道之外却能很好地工作



我的数据帧包括选项数据。我想为每个交易日期找到最接近资金的选项。不幸的是

ir_OEX_data %>% group_by(quotedate) %>% which.min(abs(moneyness_call  - 1))

导致以下错误:

错误,其中.min(.,abs(ir_OEX_data$moneyness_call-1((:未使用的参数(abs(ir_OEX_data$moneyness_call-1((

但当我单独运行时:

which.min(abs(ir_OEX_data$moneyness_call  - 1))

这个命令运行得非常好。

我在这里犯了什么错?

问题:并非所有函数都是管道友好的

{magrittr}管道与写为";管道友好型"这些方法通常将数据帧作为第一个参数,并且可以使用数据掩码来引用该数据帧中的列,而无需为它们加前缀。例如,许多{dplyr}动词对管道友好。

which.min对管道不友好。你的代码,

ir_OEX_data %>% group_by(quotedate) %>% which.min(abs(moneyness_call  - 1))

实际上相当于

which.min(
group_by(ir_OEX_data, quotedate), 
abs(moneyness_call  - 1)
)

但是which.min只期望一个参数,因此抛出一个错误。

解决方案1:导出管道(%$%(

有几种方法可以解决这个问题。一个是{magrittr}显示管道%$%,它使您的列名可用于下一个函数,而无需传递数据:

library(magrittr)
library(dplyr)
ir_OEX_data %>% 
group_by(quotedate) %$% 
which.min(abs(moneyness_call  - 1))

解决方案2:在管道友好功能内部使用

如果你想把which.min的结果添加到你的数据集中,你只需要在summarizemutate:中使用它

ir_OEX_data %>% 
group_by(quotedate) %>% 
summarize(call_which_min = which.min(abs(moneyness_call  - 1)))

解决方案3:编写一个管道友好的包装器

您还可以将非友好函数放入管道友好包装器中。这在这里可能有些过头了,但在更复杂的情况下可能会有用。

which_min_pipe <- function(.data, x) {
.data %>% summarize(out = which.min({{ x }})) %>% pull(out)
}
ir_OEX_data %>% 
group_by(quotedate) %>% 
which_min_pipe(abs(moneyness_call - 1))

最新更新