1

目标:使用 TTR::stoch 和 tidyquant 包计算所有变量的 nFastK 的三个不同值的随机变量。

主题 1:错误信息

下面的代码片段有效,但使用选项引发错误:bounded = TRUE。错误的原因是什么?

rm(list = ls())
library(tidyquant)
library(lubridate)

my_data <- tibble(  Symbol = as_factor(c( rep("a", 100), rep("b", 100)))
                    , Date   = rep( ymd("2017-11-14") + 7 * (0:99), 2) # weekly 
                    , major  = c (10000 + sample(-800:300, 100), (8000 + sample(-100:900, 100)))
                    , v1     = sample(-1000:1000, 200 ) / 100
                    , v2     = sample(-100:1200, 200) / 100
)


my_final <- my_data %>% 
  gather( -Date, -Symbol, key = "kkeys", value = "wwords") %>%
  mutate(kkeys = as_factor(kkeys)) %>%
  group_by(Symbol, kkeys) %>%
  tq_mutate(
    # tq_mutate args
    select     = wwords,
    mutate_fun = stoch, 
    # args to mutate_fun
    nFastK = 10
    # , bounded = FALSE  # <- uncomment this line for error!
  ) %>%
  select( -wwords, -fastD, -stoch ) %>% 
  mutate( fastK = round(fastK, digits = 2)) %>%
  spread( kkeys, fastK) 

主题 2:关于这个问题的函数式编程。

一个 for 循环产生三个 nFastK 值调用上面的方法,然后像这样重命名和右连接到最终表。
这只是我原始代码的简要说明:

my_periods <- c(5, 10, 20)
my_vars    <- my_data %>% select (-Date, -Symbol) %>% colnames()
my_final   <- my_data

for (i in seq_along(my_periods)) {

  # Create unique Colnames
  my_vars_to <- str_c( my_vars, "_pk", my_periods[i])

  my_final <- 

    my_data %>% 
    # Do all of the above from topic 1 plus this 
    rename_at( vars(my_vars), ~ my_vars_to) %>%
    right_join(my_final,  by = c("Symbol", "Date"))

}

这个循环有效,让我得到我想要的。仍然处于陡峭的学习曲线中,有两个问题:

问题1:ACC。对于 Wickham 来说,使用 Arnold 提供的解决方案,预分配运行得更快。与 right_join() 相比,如何编写此代码来预分配内存?或者这是一个好的解决方案?我看了https://jrnold.github.io/r4ds-exercise-solutions/iteration.html

问题 2:在阅读了一些教程之后,purrr::map() 似乎比 for 循环更合适。即使在这里阅读教程和问题后,我也无法理解如何正确编写它。您能否提供一个例子或指出更多阅读的方向?

最后:

感谢您通过示例、小插曲和其他帖子提供的所有帮助。这可能是我遇到过的最活跃、最有帮助和知识渊博的社区之一。作为 RI 的新用户,请欣赏 stackoverflow 和任何其他网站上的许多示例。这是我的第一篇文章。谢谢。

4

0 回答 0