gpt4 book ai didi

r - 为什么命令在 R 中的管道运算符中不起作用,但在管道外却运行良好?

转载 作者:行者123 更新时间:2023-12-01 23:04:12 25 4
gpt4 key购买 nike

我的数据框包含选项数据。我想为每个交易日期找到最接近货币的选项。不幸的是

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

导致以下错误:

Error in which.min(., abs(ir_OEX_data$moneyness_call - 1)) :unused argument (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:exposition pipe (%$%)

有几种方法可以解决这个问题。一个是 {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))

关于r - 为什么命令在 R 中的管道运算符中不起作用,但在管道外却运行良好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71277746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com