Problem: not all functions are pipe-friendly
{magrittr} pipes work best with functions written to be "pipe-friendly." These generally take a dataframe as a first argument, and may use data masking to let you refer to columns within that dataframe without prefixing them. e.g., many {dplyr} verbs are pipe-friendly.
which.min
isn't pipe-friendly. Your code,
ir_OEX_data %>% group_by(quotedate) %>% which.min(abs(moneyness_call - 1))
is actually equivalent to
which.min(
group_by(ir_OEX_data, quotedate),
abs(moneyness_call - 1)
)
but which.min
expects only one argument, so throws an error.
Solution 1: the exposition pipe (%$%)
There are a few ways to deal with this. One is the {magrittr} exposition pipe, %$%
, which makes your column names available to the next function without passing the data:
library(magrittr)
library(dplyr)
ir_OEX_data %>%
group_by(quotedate) %$%
which.min(abs(moneyness_call - 1))
Solution 2: use inside a pipe-friendly function
If you wanted to add the result of which.min
to your dataset, you'd just need to use it inside summarize
or mutate
:
ir_OEX_data %>%
group_by(quotedate) %>%
summarize(call_which_min = which.min(abs(moneyness_call - 1)))
Solution 3: write a pipe-friendly wrapper
You can also put a non-friendly function in a pipe-friendly wrapper. This would probably be overkill here, but can be useful in more complex cases.
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))