2012-11-26 40 views
0

我有一个使用R中的as.ts函数创建的对象,现在我想要一个简单的方法来转换其中一个变量并将其添加到同一个对象。因此,例如向R中的ts对象添加一个变量

tsMloa <- ts(read.dta("http://www.stata-press.com/data/r12/mloa.dta"), frequency=12, start=1959) 
tsMloa[, "meanLog"] <- tsMloa[,"log"] - mean(tsMloa[,"log"]) 

给我一个subscript out of bounds错误。我怎样才能解决这个问题?

回答

2

首先,您应该考虑将require(foreign)添加到您的示例代码中,因为它需要运行您的代码。

我不知道*.dta文件或者其格式什么,但我可以告诉你,如果你想在R时间序列的工作,你会做很好地窥视zooxts家庭功能。

考虑到这一点,请尝试以下操作:

require(xts) 
require(foreign) 

tsMloa <- ts(read.dta("http://www.stata-press.com/data/r12/mloa.dta"), frequency=12, start=1959) 

tt <- seq(as.Date("1959-01-01"), as.Date("1990-12-01"), by='mon') 
tsMloa_x <- xts(unclass(tsMloa)[,1:3], order.by=tt) 

tsMloa_x$meanLog <- tsMloa_x$log - mean(tsMloa_x$log) 

这应该做你正在寻找什么 - 它给你一个理由寻找到了很好的封装。


zoo做这 - 再加上我已经创建了一个功能,把你的整数变成个月。

require(foreign) 
require(zoo) 

Mloa <- read.dta("http://www.stata-press.com/data/r12/mloa.dta"), frequency=12, start=1959) 

intToMonth <- function(intMonth, origin = "1960-01-01"){ 
    dd <- as.POSIXlt(origin) 
    ddVec <- rep(dd, length(intMonth)) 
    ddVec$mon <- ddVec$mon + intMonth%%12 
    ddVec$year <- ddVec$year + intMonth%/%12 
    ddRet <- as.Date(ddVec) 
    return(ddRet) 
} 

dateString <- intToMonth(Mloa[, 'tm']) 

zMloa <- zoo(Mloa[, -2], dateString) 
zMloa$meanLog <- zMloa$log - mean(zMloa$log) 

正如我所看到的,您的问题是将源文件中的时间戳转换为R可以理解并可以使用的内容。我发现这部分适应R特别棘手。

上面的函数会把你的月份整数,并把它们变成一个Date对象。结果输出将与zooxts一起使用,作为order.by参数。

如果您需要更改原点日期,只需向函数提供第二个参数即otherDateString <- intToMonth(timeInts, "2011-01-01")

+0

谢谢!是否可以将使用'read.dta'直接读入的对象转换为'xts'对象? 'dfMloa < - as.data.frame(read.dta(“http://www.stata-press.com/data/r12/mloa.dta”,convert.dates = T))'将其作为一个'data.frame'然后'xts(dfMloa,order.by = as.Date(dfMloa $ tm))'?然而,这并不能给我正确的日期。 – tchakravarty

+0

@fgnu:'read.dta'已经返回一个data.frame;不需要将其包装在'as.data.frame'中。 xts要求索引是一个日期时间类,而'tm'只是一个数字,所以它不起作用(这就是@ricardo创建'tt'的原因)。动物园没有这个要求,所以你可以使用'zmloa < - 动物园(mloa [, - 2],mloa $ tm)',其中'mloa'是'read.dta'函数的结果。 –

+0

@fg nu - 我认为你的问题在于在R中获得日期转换的细节。我也发现这一点很棘手。我已经写了一个小函数,它将映射到月份的整数转换为R可以使用的日期。 – ricardo