我有以下问题:我在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那样)
感谢您的帮助!
答案 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)
这是一个使用apply
和MARGIN = 1
在stocks
行上运行您的函数的解决方案。
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)
)