2013-04-12 71 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