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

dplyr programming: how to access columns of .x in map

嵌套数据框并将每个 tibble 转换为 xts 的情况经常发生,足以发挥其自身的作用。

输入数据帧应该由nest_var嵌套,然后每个嵌套数据帧应该转换为一个xts对象order.by 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)

但这不是在最后一行的 mutate、map 组合中访问 .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 "}"

您已成功访问专栏。但是 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))

给你想要的。

下面只是一种简化的嵌套方法。不确定它是否直接满足您的需求。

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>