包含多个参数的函数的For-Loops(R)

时间:2017-04-23 15:28:28

标签: r loops quantmod

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

我的代码的相关部分:

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

对于测试,我现在定义了我的数据,该数据将被循环:

{{1}}

现在有问题的一行:

{{1}}

你可能已经看到我是R的绝对初学者;希望你能给我一个答案,我如何让这个工作,以及我如何将它变成像dataframe或smth这样的输出。像那样(就像原来的getSymbols-function那样)

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我们可以创建一个新环境

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

答案 1 :(得分:0)

这是一个使用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)

)