tq_mutate()引发错误-循环编程技术

时间:2018-11-15 13:41:30

标签: r purrr tidyquant

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

主题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:帐户对于Wickham而言,Arnold提供了解决方案,预分配的运行速度更快。与right_join()相比,该代码将如何编写以预分配内存?还是这是一个好的解决方案?我看着https://jrnold.github.io/r4ds-exercise-solutions/iteration.html

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

最后:

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

0 个答案:

没有答案