dplyr编程:如何访问地图中的.x列

jus*_*ess 4 r dplyr purrr

嵌套一个数据帧并将每个小节转换为一个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)

cut*_*h44 5

您已达到访问该列的目的。但是,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)

给你想要的。