重新提问如下:
我已经有了一些进展,但是R的行为很奇怪...
这是我开始使用的xts。
我想要制作的是:
我写了一个类似这样的函数:
这成功地添加了thisDate(逐步在命令行上运行代码)。但是添加nextDate的部分似乎覆盖了它!我还发现了意外的NA行。仍在努力解决这个问题...
我在第一列中放置了“无标题”,以表示它是xts日期索引,而不是向量/矩阵的实际部分。
关于删除额外行的部分是因为我还没有解决覆盖问题并正在进行实验。在最终答案中不需要它,但这是我目前的进展情况。
最后,当我查询此结果并尝试将nextDate转换为日期时,我得到...
所以我有点混乱...
下面是原始问题:
我在R中有一个时间序列(我学得很快,但显然不够快!)如下:
我想要在每一行中创建一个新列,其中包含下一行的日期索引的衍生版本。
“对于数值(使用滞后)很容易做到,但对于日期索引本身不是那么容易。我可能可以通过使用各种查找等方法来解决它,但这很凌乱。您必须匹配其他字段,或者调整行号,这感觉不太符合R的精神。有没有一种漂亮、简洁、优雅的方法来做到这一点?我相信只要有人给出答案,我就会恍然大悟!但到目前为止,我在这个网站上没有找到关于滞后日期索引的答案。我想这样做的原因是我想使用每一对行中的日期来查询另一个系列。所以可能有更好的方法。”
我已经有了一些进展,但是R的行为很奇怪...
这是我开始使用的xts。
<no title> Value Value2 Value3
2002-08-21 21 2 27
2003-09-10 22 42 87
2004-02-12 23 62 67
2005-04-13 24 13 73
2006-05-13 25 4 28
2007-08-14 20 68 25
2008-03-06 19 82 22
我想要制作的是:
<no title> Value Value2 Value3 ThisDate NextDate
2002-08-21 21 2 27 2002-08-21 2003-09-10
2003-09-10 22 42 87 2003-09-10 2004-02-12
2004-02-12 23 62 67 2004-02-12 2005-04-13
2005-04-13 24 13 73 2005-04-13 2006-05-13
2006-05-13 25 4 28 2006-05-13 2007-08-14
2007-08-14 20 68 25 2007-08-14 2008-03-06
2008-03-06 19 82 22 2008-03-06 NA
我写了一个类似这样的函数:
StackUpAdjacentDates <- function(sourceTimeSeries)
{
returnValue <- sourceTimeSeries
thisDate <- as.character(index(sourceTimeSeries))
nextDate <- c(as.character(thisDate[2:length(thisDate)]),NA)
thisDate <- as.Date(strptime(thisDate, "%Y-%m-%d"))
nextDate <- as.Date(strptime(nextDate, "%Y-%m-%d"))
# set up thisDate in a new column
if ("thisDate" %in% colnames(returnValue) )
{
returnValue<-returnValue[,-which(colnames(returnValue)=="thisDate")]
}
returnValue <- cbind(returnValue, thisDate)
colnames(returnValue)[ncol(returnValue)] <- "thisDate"
returnValue$thisDate <- thisDate
# add nextDate in a new column
if ("nextDate" %in% colnames(returnValue) )
{
returnValue<-returnValue[,-which(colnames(returnValue)=="nextDate")]
}
returnValue <- cbind(returnValue,nextDate)
colnames(returnValue)[ncol(returnValue)] <- "nextDate"
#returnValue$nextDate <- nextDate
}
这成功地添加了thisDate(逐步在命令行上运行代码)。但是添加nextDate的部分似乎覆盖了它!我还发现了意外的NA行。仍在努力解决这个问题...
<no title> Value Value2 Value3 nextDate
2002-08-21 21 78 76 12305
2003-09-10 22 70 23 12460
2004-02-12 23 84 22 12886
2005-04-13 24 97 28 13281
2006-05-13 25 26 97 13739
2007-08-14 20 59 22 13944
2008-03-06 19 64 98 NA
<NA> NA NA NA NA
我在第一列中放置了“无标题”,以表示它是xts日期索引,而不是向量/矩阵的实际部分。
关于删除额外行的部分是因为我还没有解决覆盖问题并正在进行实验。在最终答案中不需要它,但这是我目前的进展情况。
最后,当我查询此结果并尝试将nextDate转换为日期时,我得到...
> as.Date(returnValue$nextDate)
Error in as.Date.default(returnValue$nextDate) :
do not know how to convert 'returnValue$nextDate' to class "Date"
所以我有点混乱...
下面是原始问题:
我在R中有一个时间序列(我学得很快,但显然不够快!)如下:
Value
2002-08-21 21
2003-09-10 22
2004-02-12 23
2005-04-13 24
2006-05-13 25
2007-08-14 20
2008-03-06 19
我想要在每一行中创建一个新列,其中包含下一行的日期索引的衍生版本。
Value NextDate
2002-08-21 21 2003-09-10
2003-09-10 22 2004-02-12
2004-02-12 23 2005-04-13
2005-04-13 24 2006-05-13
2006-05-13 25 2007-08-14
2007-08-14 20 2008-03-06
2008-03-06 19 [...]
“对于数值(使用滞后)很容易做到,但对于日期索引本身不是那么容易。我可能可以通过使用各种查找等方法来解决它,但这很凌乱。您必须匹配其他字段,或者调整行号,这感觉不太符合R的精神。有没有一种漂亮、简洁、优雅的方法来做到这一点?我相信只要有人给出答案,我就会恍然大悟!但到目前为止,我在这个网站上没有找到关于滞后日期索引的答案。我想这样做的原因是我想使用每一对行中的日期来查询另一个系列。所以可能有更好的方法。”
merge(X, lag(X))
这个在xts
中廉价且快速的方法。如果你真的需要额外的日期列(为什么?),那就切换到使用data.frame
并且放弃使用xts
。由你决定。 - Dirk Eddelbuettelzoo
和xts
已经为你做好了。阅读zoo
文档以获取灵感。 - Dirk Eddelbuettel