如何循环遍历全局环境中的对象 - R
How to loop through objects in the global environment - R
我已经四处寻找这个问题的解决方案,但我似乎无法弄清楚。我没有太多在 R 中使用 xts 对象的经验。
我有 40 个 xts 对象(ETF 数据),我想 运行 对每个对象分别使用 quantmod 函数 WeeklyReturn
。
我尝试使用 ls()
函数来引用它们:
lapply(ls(), weeklyReturn)
我也试过object()
功能
lapply(object(), weeklyReturn)
我也曾尝试在我的调用中使用 as.xts()
强制将 ls() 对象用作 xts,但无济于事。
如何在环境中的每个 xts 对象上 运行 这个函数?
谢谢,
最好将所有 xts 对象加载到一个列表中,或者以 returns 它们在列表中开始的方式创建它们。然后你可以做results = lapply(xts.list, weeklyReturn)
。
要在全局环境中使用对象,您可以测试该对象是否是 xts
对象,然后 运行 weeklyReturn
如果是的话。像这样:
results = lapply(setNames(ls(), ls()), function(i) {
x = get(i)
if(is.xts(x)) {
weeklyReturn(x)
}
})
results = results[!sapply(results, is.null)]
或者您可以 select 仅以 xts 对象开头:
results = sapply(ls()[sapply(ls(), function(i) is.xts(get(i)))],
function(i) weeklyReturn(get(i)), simplify=FALSE, USE.NAMES=TRUE)
lapply(ls(), weeklyReturn)
不起作用,因为 ls()
returns 对象名称为字符串。 get
函数将字符串作为参数,returns 具有该名称的对象。
使用 tidyquant
包的替代解决方案。请注意,这是基于数据框的,因此我不会使用 xts
对象。我使用两个核心函数来扩展分析。首先,tq_get()
用于从 ETF 符号向量到获取价格。其次,tq_transmute()
用于将weeklyReturn
函数应用于调整后的价格。
library(tidyquant)
etf_vec <- c("SPY", "QEFA", "TOTL", "GLD")
# Use tq_get to get prices
etf_prices <- tq_get(etf_vec, get = "stock.prices", from = "2017-01-01", to = "2017-05-31")
etf_prices
#> # A tibble: 408 x 8
#> symbol date open high low close volume adjusted
#> <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 SPY 2017-01-03 227.121 227.919 225.951 225.24 91366500 223.1760
#> 2 SPY 2017-01-04 227.707 228.847 227.696 226.58 78744400 224.5037
#> 3 SPY 2017-01-05 228.363 228.675 227.565 226.40 78379000 224.3254
#> 4 SPY 2017-01-06 228.625 229.856 227.989 227.21 71559900 225.1280
#> 5 SPY 2017-01-09 229.009 229.170 228.514 226.46 46265300 224.3848
#> 6 SPY 2017-01-10 228.575 229.554 228.100 226.46 63771900 224.3848
#> 7 SPY 2017-01-11 228.453 229.200 227.676 227.10 74650000 225.0190
#> 8 SPY 2017-01-12 228.595 228.847 227.040 226.53 72113200 224.4542
#> 9 SPY 2017-01-13 228.827 229.503 228.786 227.05 62717900 224.9694
#> 10 SPY 2017-01-17 228.403 228.877 227.888 226.25 61240800 224.1767
#> # ... with 398 more rows
# Use tq_transmute to apply weeklyReturn to multiple groups
etf_returns_w <- etf_prices %>%
group_by(symbol) %>%
tq_transmute(select = adjusted, mutate_fun = weeklyReturn)
etf_returns_w
#> # A tibble: 88 x 3
#> # Groups: symbol [4]
#> symbol date weekly.returns
#> <chr> <date> <dbl>
#> 1 SPY 2017-01-06 0.0087462358
#> 2 SPY 2017-01-13 -0.0007042173
#> 3 SPY 2017-01-20 -0.0013653367
#> 4 SPY 2017-01-27 0.0098350474
#> 5 SPY 2017-02-03 0.0016159256
#> 6 SPY 2017-02-10 0.0094619381
#> 7 SPY 2017-02-17 0.0154636969
#> 8 SPY 2017-02-24 0.0070186222
#> 9 SPY 2017-03-03 0.0070964211
#> 10 SPY 2017-03-10 -0.0030618336
#> # ... with 78 more rows
我已经四处寻找这个问题的解决方案,但我似乎无法弄清楚。我没有太多在 R 中使用 xts 对象的经验。
我有 40 个 xts 对象(ETF 数据),我想 运行 对每个对象分别使用 quantmod 函数 WeeklyReturn
。
我尝试使用 ls()
函数来引用它们:
lapply(ls(), weeklyReturn)
我也试过object()
功能
lapply(object(), weeklyReturn)
我也曾尝试在我的调用中使用 as.xts()
强制将 ls() 对象用作 xts,但无济于事。
如何在环境中的每个 xts 对象上 运行 这个函数?
谢谢,
最好将所有 xts 对象加载到一个列表中,或者以 returns 它们在列表中开始的方式创建它们。然后你可以做results = lapply(xts.list, weeklyReturn)
。
要在全局环境中使用对象,您可以测试该对象是否是 xts
对象,然后 运行 weeklyReturn
如果是的话。像这样:
results = lapply(setNames(ls(), ls()), function(i) {
x = get(i)
if(is.xts(x)) {
weeklyReturn(x)
}
})
results = results[!sapply(results, is.null)]
或者您可以 select 仅以 xts 对象开头:
results = sapply(ls()[sapply(ls(), function(i) is.xts(get(i)))],
function(i) weeklyReturn(get(i)), simplify=FALSE, USE.NAMES=TRUE)
lapply(ls(), weeklyReturn)
不起作用,因为 ls()
returns 对象名称为字符串。 get
函数将字符串作为参数,returns 具有该名称的对象。
使用 tidyquant
包的替代解决方案。请注意,这是基于数据框的,因此我不会使用 xts
对象。我使用两个核心函数来扩展分析。首先,tq_get()
用于从 ETF 符号向量到获取价格。其次,tq_transmute()
用于将weeklyReturn
函数应用于调整后的价格。
library(tidyquant)
etf_vec <- c("SPY", "QEFA", "TOTL", "GLD")
# Use tq_get to get prices
etf_prices <- tq_get(etf_vec, get = "stock.prices", from = "2017-01-01", to = "2017-05-31")
etf_prices
#> # A tibble: 408 x 8
#> symbol date open high low close volume adjusted
#> <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 SPY 2017-01-03 227.121 227.919 225.951 225.24 91366500 223.1760
#> 2 SPY 2017-01-04 227.707 228.847 227.696 226.58 78744400 224.5037
#> 3 SPY 2017-01-05 228.363 228.675 227.565 226.40 78379000 224.3254
#> 4 SPY 2017-01-06 228.625 229.856 227.989 227.21 71559900 225.1280
#> 5 SPY 2017-01-09 229.009 229.170 228.514 226.46 46265300 224.3848
#> 6 SPY 2017-01-10 228.575 229.554 228.100 226.46 63771900 224.3848
#> 7 SPY 2017-01-11 228.453 229.200 227.676 227.10 74650000 225.0190
#> 8 SPY 2017-01-12 228.595 228.847 227.040 226.53 72113200 224.4542
#> 9 SPY 2017-01-13 228.827 229.503 228.786 227.05 62717900 224.9694
#> 10 SPY 2017-01-17 228.403 228.877 227.888 226.25 61240800 224.1767
#> # ... with 398 more rows
# Use tq_transmute to apply weeklyReturn to multiple groups
etf_returns_w <- etf_prices %>%
group_by(symbol) %>%
tq_transmute(select = adjusted, mutate_fun = weeklyReturn)
etf_returns_w
#> # A tibble: 88 x 3
#> # Groups: symbol [4]
#> symbol date weekly.returns
#> <chr> <date> <dbl>
#> 1 SPY 2017-01-06 0.0087462358
#> 2 SPY 2017-01-13 -0.0007042173
#> 3 SPY 2017-01-20 -0.0013653367
#> 4 SPY 2017-01-27 0.0098350474
#> 5 SPY 2017-02-03 0.0016159256
#> 6 SPY 2017-02-10 0.0094619381
#> 7 SPY 2017-02-17 0.0154636969
#> 8 SPY 2017-02-24 0.0070186222
#> 9 SPY 2017-03-03 0.0070964211
#> 10 SPY 2017-03-10 -0.0030618336
#> # ... with 78 more rows