我的数据帧包括选项数据。我想为每个交易日期找到最接近资金的选项。不幸的是
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
的结果添加到你的数据集中,你只需要在summarize
或mutate
:中使用它
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))