【问题标题】:For-Loops for functions containing multiple arguments (R)包含多个参数的函数的 For 循环 (R)
【发布时间】:2017-04-23 15:28:28
【问题描述】:

我有以下问题:我在 R 中有一个自定义函数,它应该获取财务数据(使用 quantmod);现在我正在考虑我可能想要获得几家公司的股票价格,或者如果我可以拥有一个包含我的函数参数的数据框并且一个循环只是遍历数据的所有部分,我会发现更方便框架,然后将结果保存到我的环境中(或特定的新数据框或其他)。

我的代码的相关部分:

#Define Custom Function to get Data
pull = function(abbreviation,from,to){
  getSymbols(Symbols = abbreviation, from = as.Date(from), to = as.Date(to),env = .GlobalEnv, reload.Symbols = FALSE, verbose = FALSE, warnings = TRUE, src = "yahoo", symbol.lookup = TRUE, auto.assign = TRUE)
  #return(abbreviation_data) ##This part did not work but that should not be the relevant one inn this function as the function itself works;
}

为了测试,我现在定义了要循环的数据:

abbreviation = c("MSFT","AAPL")
from = c("2010-01-01","2011-01-01")
to = c("2017-04-19","2017-04-19")
stocks = data.frame(abbreviation,from,to)

现在有问题的行:

for (i in 1:nrow(stocks)){
  pull(stocks[i,1],stocks[i,2],stocks[i,3])}

正如您可能已经看到的那样,我是 R 的绝对初学者;希望你能给我一个答案,我是如何让这个工作的,以及我如何把它变成像数据框或其他东西这样的输出。像那样(就像原来的 getSymbols 函数一样)

感谢您的帮助!

【问题讨论】:

    标签: r loops quantmod


    【解决方案1】:

    这是一个解决方案,它使用 applyMARGIN = 1stocks 的行上运行您的函数。

    apply(stocks, 1, function(x)
    
        getSymbols(Symbols = x["abbreviation"],
                   from = as.Date(x["from"]),
                   to = as.Date(x["to"]),
                   src = "yahoo",
                   env = .GlobalEnv,
                   reload.Symbols = FALSE,
                   verbose = FALSE,
                   warnings = TRUE,
                   symbol.lookup = TRUE,
                   auto.assign = TRUE)
    
    )
    

    正如getSymbols 默认情况下所做的那样,该代码会在您的工作环境中创建与您想要的符号相对应的新对象。

    如果您要在结果数据帧上迭代其他函数,您可能希望使用 lapply 代替,让 getSymbols 将结果返回到一个列表,其中每个项目对应于您的一个符号.下面是一些执行此操作的代码:

    # lapply works best on a list, so we can use another call to lapply to create
    # a list of rows from stocks
    mylist <- lapply(lapply(seq(nrow(stocks)), function(i) stocks[i,]), function(x)
    
        # because the elements of the list we just created are data frames, we need
        # to tweak the indexing to work with column names, so we add leading commas
        getSymbols(Symbols = as.character(x[,"abbreviation"]),
                   from = as.Date(x[,"from"]),
                   to = as.Date(x[,"to"]),
                   src = "yahoo",
                   env = .GlobalEnv,
                   reload.Symbols = FALSE,
                   verbose = FALSE,
                   warnings = TRUE,
                   symbol.lookup = TRUE,
                   # here's the other change, so results go to list instead of env
                   auto.assign = FALSE)
    
    )
    

    【讨论】:

    • 您好,首先让我感谢您的回答。我遇到的问题是我想使用包含所有价格的数据框(在我的版本中,我只使用了 2 只股票并因此手动进行)将其减少为仅日期和收盘价,将其合并到数据框和然后使用 rCharts-Morrisplot 来显示它。我如何访问您版本中的所有数据,尤其是考虑到我有更多库存?
    • 有很多方法可以做到这一点,但此时您只是抛出一堆步骤并说“请编写为我完成所有这些的代码”。这并不是 SO 真正的工作方式。
    【解决方案2】:

    我们可以创建一个新环境

    abb1 <- new.env()
    for(i in seq_along(abbreviation)) abb1[[abbreviation[i]]] <-  getSymbols(abbreviation[i], 
                      from = from[i], to = to[i])
    lst <- mget(ls(envir = abb1))
    names(lst)
    #[1] "AAPL" "MSFT"
    
    lapply(lst, head, 3)
    #$AAPL
    #           AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
    #2011-01-03    325.64    330.26   324.84     329.57   111284600      42.69894
    #2011-01-04    332.44    332.50   328.15     331.29    77270200      42.92178
    #2011-01-05    329.55    334.34   329.50     334.00    63879900      43.27289
    
    #$MSFT
    #           MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted
    #2010-01-04     30.62     31.10    30.59      30.95    38409100      25.55549
    #2010-01-05     30.85     31.10    30.64      30.96    49749600      25.56374
    #2010-01-06     30.88     31.08    30.52      30.77    58182400      25.40686
    

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多