2013-04-12 72 views
4

我已经在环境中存储了xts对象。我可以在存储在环境中时对这些对象进行分类,即对其进行“就地”处理吗?我可以通过参考他们的colname来提取这些对象吗?从环境中获取xts对象

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

# 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,所以我可以方便地将它们绘制在一起或分开。

这里有一些事情我也能做到:

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

这种方法的缺点是,我需要的数据$后明确键入FEDFUNDS。但我想从预先确定的代理商列表中进行工作,例如

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

我有一个更近了一步是通过组合功能系统得到与功能lapply

# extract xts objects as a list 
dtxl <- lapply(tickers, get, envir = data) 

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

我非常想写类似数据$行情[1]数据$行情[[1]],但没有奏效。我也尝试过paste0('data','$',tickers [1])及其变化,有或没有引号。无论如何,我认为环境中的数据顺序不是系统的,所以我真的更喜欢使用代号的名称而不是索引,就像data $ tickers [colnames = FEDFUNDS]没有一个本段的尝试已奏效。

如果我的问题不清楚,我很抱歉,但请请求澄清。并感谢您的关注!

编辑:子集

我已经收到了一些精彩的建议。 GSee的答案有几个非常有用的技巧。以下是如何在XTS对象感兴趣的日期间隔内子集:

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

'与'在处理环境时非常有用。 (data,FEDFUNDS [paste(date.start,date.end,sep =“/”)])' – GSee

+0

Re:你最后一段,你在找'get(tickers [1],pos = data)' ? – GSee

+0

谢谢Gsee。我尝试过使用第一个构造,但是我没有设法使用它来处理代理。我需要看看第二种方法,我不知道如何使用'pos'。无论如何,你在答案中给了我一些很好的方法。谢谢。 – PatrickT

回答

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代表“搞定,申请,分配“和gsa代表”获得,子集,分配“。

要,得到一些行情数据子集的数据,然后分配到一个环境

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

gaa,您可以在相同或不同的环境下保存之前申请任何功能,每个对象。

+0

+1为方便函数在'qmao'中,我刚开始探索qmao,并花了一些时间尝试使用'do.call.rbind',但环境导致了我的问题,'gaa'和'gsa'是完美的: - 读魔术我现在要坐下来看看'qmao'手册!--) – PatrickT

+0

我来过acros s'as.environment',但我缺少'setNames'以及如何在方括号中使用'eapply'。现在将调查这些。谢谢! – PatrickT

+0

@PatrickT,参见编辑使用'setNames'的替代方法。这里有另一种选择:'as.environment(sapply(tickers,get,envir = data,simplify = FALSE))' – GSee

1

如果我正确读取的问题,你想水木清华这样的:

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

谢谢eddi。目前这给了我下面的错误信息:'在do.call中的错误(cbind,sapply(tickers2,function(ticker)get(ticker,:第二个参数必须是一个列表)'我尝试用第二个参数.list,但这显然是不够的 – PatrickT

+0

@PatrickT,听起来像'sapply'没有返回一个列表(对于何时以及如何使用'sapply'非常小心的原因之一)尝试添加参数'简化= FALSE',或者只是使用'lapply',而不是'sapply',这个答案是要具有很多列返回一个'xts'。 – GSee

+0

你说得对GSEE,即工作,谢谢。 – PatrickT