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

时间:2018-01-12 19:12:01

标签: r dplyr purrr

嵌套数据帧并将每个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 "}"

2 个答案:

答案 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>