嵌套一个数据帧并将每个小节转换为一个xts经常发生,足以使其具有应有的功能。
输入数据框应由nest_var嵌套,然后每个嵌套数据框应转换为xts对象顺序。
这是我的尝试
library(tidyverse)
library(purrr)
library(magrittr)
library(xts)
data("sample_matrix")
df <- sample_matrix %>%
as.data.frame() %>%
rownames_to_column(var='dt') %>%
gather(key=ohlc, value=val, -dt)
nest_xts <- function(df_in, nest_var, t_var) {
require(rlang)
nest_var <- enquo(nest_var)
t_var <- enquo(t_var)
df_in %>% group_by(!!nest_var) %>%
nest() %>%
mutate(data := map(data, ~xts(.x, order.by=.x[quo_name(t_var)])))
}
nest_xts(df, ohlc, dt)
Run Code Online (Sandbox Code Playgroud)
但这不能访问最后一行的mutate map组合中的.x列。
Error in mutate_impl(.data, dots) :
Evaluation error: order.by requires an appropriate time-based object.
Run Code Online (Sandbox Code Playgroud)
还尝试将最后一行更改为
mutate(data := map(data, ~xts(.x, order.by=.x$!!t_var)))
Run Code Online (Sandbox Code Playgroud)
但是函数无法编译;
Error: unexpected '!' in:
" nest() %>%
mutate(data := map(data, ~xts(.x, order.by=.x$!"
> }
Error: unexpected '}' in "}"
Run Code Online (Sandbox Code Playgroud)
您已达到访问该列的目的。但是,tbl_df[colname]
是不是vector
,但tbl_df
。
order.by = .x[quo_name(t_var)][[1]]
# or
order.by = pull(.x, quo_name(t_var))
# and (carelessly?)
df <- df %>% mutate(dt = as.Date(dt))
Run Code Online (Sandbox Code Playgroud)
给你想要的。