包含多个参数的函数的 For 循环 (R)
For-Loops for functions containing multiple arguments (R)
我有以下问题:我在 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 的绝对初学者;希望你能给我一个答案,我是如何让这个工作的,我如何才能把它变成像数据框或 smth 这样的输出。就像那样(就像原来的 getSymbols 函数一样)
感谢您的帮助!
我们可以创建一个新环境
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
这是一个解决方案,它使用 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
return 结果添加到列表中其中每个项目对应于您的一个符号。这是执行此操作的一些代码:
# 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)
)
我有以下问题:我在 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 的绝对初学者;希望你能给我一个答案,我是如何让这个工作的,我如何才能把它变成像数据框或 smth 这样的输出。就像那样(就像原来的 getSymbols 函数一样)
感谢您的帮助!
我们可以创建一个新环境
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
这是一个解决方案,它使用 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
return 结果添加到列表中其中每个项目对应于您的一个符号。这是执行此操作的一些代码:
# 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)
)