我在环境中存储了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"
我有两个截然不同的目标。
以下是我确实要做的一些事情:
# 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))
答案 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
,这样您就不必使用lapply
或setNames
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="/")])
)