以下是我正在努力实现的一个例子。
library(dplyr)
tbl.data <- tidyquant::tq_get(c("GS", "C", "BAC"))
to.xts <- function(group, group_key, date_col, price_col){
a <- group %>% dplyr::pull({{ price_col }})
b <- group %>% dplyr::pull({{ date_col }})
x <- xts::xts(a, order.by=b)
colnames(x) <- key$symbol
x
}
make.xts <- function(data, date_col, price_col){
data %>%
group_by(symbol) %>%
group_map(~to.xts(.x, .y, date_col, price_col))
}
# Failed example one:
tbl.data %>% group_by(symbol) %>% group_map(to.xts, date, close)
# Failed example two:
make.xts(tbl.data, date, close)
# Error in `dplyr::pull()`:
# ! Can't extract column with `!!enquo(var)`.
# ✖ `!!enquo(var)` must be numeric or character, not a function.
# Run `rlang::last_error()` to see where the error occurred.
# However, If I single out a group myself and apply `to.xts` to that group it'll work. The only thing changed, which I doubt that it would have effect on the function itself, is that the `group_key` is now a string (it was a data-variable in the context of `group_map`'s `.f`)
gs.grp <- tbl.data %>% dplyr::filter(symbol=="GS")
gs.grp %>% to.xts("GS", date, col)
# A simply pull operation would also work.
gs.grp %>% dplyr::pull(close)
我不太明白内部发生了什么变化;为什么会这样,哪里不对
由于错误消息显示dplyr::pull
似乎正在内部解除(enquo
)和注入(!!
),因此我将不使用包含运算符;然而,没有它,它也不工作,并导致同样的错误。
3条答案
按热度按时间ih99xse11#
我没有使用
group_map
函数太多,这里是一个替代版本,你可以试试-如果希望它们在一个
xts
对象中作为单独的列。voase2hg2#
使用
group_map
,使用公式应用于每个组:与它所基于的
purr
非常相似。在公式中,您可以使用
.或.x来表示给定组的.tbl的行的子集
.y表示键,一个一行的tibble,每个分组变量一列,用于标识组
(See文件)
或者,我们也可以使用透视来避开您的函数,并将其放在一个
xts
-对象中。输出:
wwtsj6pe3#
这并没有回答你的问题,但我想指出的是,如果你完全避免使用tidyverse模式,这会简单得多。