嵌套数据帧并将每个tibble转换为xts通常足以得到它自己的功能。
输入数据帧应该嵌套在nest_var中,然后每个嵌套的数据帧应该转换为xts对象的顺序。由t_var
这是我的尝试,
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)
但是这不是访问变种中的.x列,最后一行是地图组合。
Error in mutate_impl(.data, dots) :
Evaluation error: order.by requires an appropriate time-based object.
还尝试将最后一行更改为
mutate(data := map(data, ~xts(.x, order.by=.x$!!t_var)))
但是函数没有编译;
Error: unexpected '!' in:
" nest() %>%
mutate(data := map(data, ~xts(.x, order.by=.x$!"
> }
Error: unexpected '}' in "}"
答案 0 :(得分:4)
您已成功访问该列。但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))
给出你想要的东西。
答案 1 :(得分:1)
以下是一种简化的嵌套方法。不确定它是否直接满足您的需求。
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) %>%
summarize(data = list(xts(!!t_var, order.by=as.Date(dt))))
}
result <- nest_xts(df, ohlc, dt)
result
# A tibble: 4 x 2
# ohlc data
# <chr> <list>
# 1 Close <S3: xts>
# 2 High <S3: xts>
# 3 Low <S3: xts>
# 4 Open <S3: xts>