从环境中获取xts对象

时间:2013-04-12 21:16:39

标签: r get environment xts quantmod

我在环境中存储了xts对象。我可以将这些对象存储在一个环境中进行子集化,即“就地”对它们进行操作吗?我可以通过引用它们的 colname 来提取这些对象吗?

以下是我所得到的一个例子。

# environment in which to store data 
data <- new.env()

# Set data tickers of interest
tickers <- c("FEDFUNDS", "GDPPOT", "DGS10")

# import data from FRED database
library("quantmod")
dta <- getSymbols( tickers
  , src = "FRED"
  , env = data
  , adjust = TRUE
)

然而,这会下载整个数据集。现在,我想丢弃一些数据,保存,使用它(例如绘制它)。我希望将数据保留在此日期范围内:

# set dates of interest
date.start <- "2012-01-01"
date.end <- "2012-12-31"

我有两个截然不同的目标。

  1. 将环境中的所有数据(也是 就地行动或创造新环境并覆盖 与它的旧环境)。
  2. 只选择我选择的一些代码并将其分配,     说FEDFUNDS和DGS10,然后将它们保存为新的     环境。我还想保留这些对象的xts-ness,所以我可以方便地将它们一起或单独绘制。
  3. 以下是我确实要做的一些事情:

    # extract and subset a single xts object 
    dtx1 <- data$FEDFUNDS
    dtx1 <- dtx1[paste(date.start,date.end,sep="/")]
    

    这种方法的缺点是我需要在数据$之后显式键入FEDFUNDS。但我想从预先指定的代码清单中工作,例如

    tickers2 <- c("FEDFUNDS", "DGS10")
    

    通过将函数 get 与函数 lapply

    组合,我更接近系统化了
    # extract xts objects as a list
    dtxl <- lapply(tickers, get, envir = data)
    

    但这会返回一个列表。而且我不确定如何方便地使用此列表来对数据进行子集化,绘制它等等。我如何参考DGS10或tickers2中的一对代码?

    我非常想写一些像 data $ tickers [1] data $ tickers [[1]] 这样的东西但是没有用。我还尝试了 paste0('data','$',代码[1])以及带或不带引号的变体。无论如何,我认为环境中的数据顺序不是系统的,所以我更喜欢使用自动收报机的名称而不是其索引,比如 data $ tickers [colnames = FEDFUNDS] 本段中没有任何尝试有效。

    如果我的问题不清楚,我道歉,但请务必要求澄清。谢谢你的关注!

    编辑:子集

    我收到了一些很棒的建议。 GSee 的回答有几个非常有用的技巧。以下是如何将xts对象子集化到感兴趣的日期间隔内:

    dates <- paste(date.start, date.end, sep="/")
    as.environment(eapply(data, "[", dates))
    

2 个答案:

答案 0 :(得分:3)

这将对环境中的每个对象进行子集化,并返回包含子集化数据的环境:

data2 <- as.environment(eapply(data, "[", paste(date.start, date.end, sep="/")))

对于第二个问题,你可以做同样的事情。只需将lapply返回的列表的组件命名为setNames,然后强制转换为环境:

data3 <- as.environment(setNames(lapply(tickers, get, envir = data), tickers))

或者,更好的是,使用mget,这样您就不必使用lapplysetNames

data3 <- as.environment(mget(tickers, envir = data))

或者我实际上在qmao中设计了一些专门为此设计的便利功能:gaa代表&#34;获取,应用,分配&#34;并且gsa代表&#34; get,subset,assign&#34;。

To,获取某些代码的数据,对数据进行子集化,然后分配到环境中

gsa(tickers, subset=paste(date.start, date.end, sep="/"), env=data, 
    store.to=globalenv())

gaa允许您在保存到相同或不同的环境之前将任何函数应用于每个对象。

答案 1 :(得分:1)

如果我正确地阅读了这个问题,你想要这样的话:

dtxl = do.call(cbind, sapply(tickers2,
           function(ticker) get(ticker, env=data)[paste(date.start,date.end,sep="/")])
       )