繁体   English   中英

如何遍历全局环境中的对象 - R.

[英]How to loop through objects in the global environment - R

我已经远远地看了解这个问题的解决方案,但我似乎无法弄明白。 我在R中处理xts对象的经验不多。

我有40个xts对象(ETF数据),我想WeeklyReturn在每个WeeklyReturn上运行quantmod函数WeeklyReturn

我试图通过使用ls()函数来引用它们:

lapply(ls(), weeklyReturn) 

我也试过了object()函数

lapply(object(), weeklyReturn)

我也尝试在我的调用中使用as.xts()强制ls()对象被用作xts但无济于事。

如何在环境中的每个xts对象上运行此函数?

谢谢,

最好将所有xts对象加载到列表中,或者以一种在列表中返回它们的方式创建它们。 然后你可以做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)]

或者您只能选择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()将对象名称作为字符串返回。 get函数将字符串作为参数,并返回具有该名称的对象。

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM