【问题标题】:Indexing Date via Loop通过循环索引日期
【发布时间】:2013-04-16 03:27:26
【问题描述】:

我正在尝试使用以下代码确定日期在矩阵中的位置:

#portret is a list of daily returns for three different stocks from 1980-01-01 to 2010-12
#13.These dates are listed in the first column of the portret data frame
library(quantmod)
library(FRAPO)
getSymbols(c("F","AA","IBM"),from="1980-01-01", to="2010-12-31")
port=cbind(F$F.Adjusted,AA$AA.Adjusted,IBM$IBM.Adjusted)
portret=returnseries(port,"discrete",trim=TRUE)
portret=data.frame(index(portret),coredata=portret)
date.list=seq.Date(as.Date("1990-10-01"),as.Date("2010-10-01"),by="month")
length(date.list)
#this equals 241
date.index=matrix(0,241,2)
for(i in 1:241){
    date.index[i,]=which(portret[,1]==as.character(date.list[i]),arr.ind=TRUE)}

我不断收到此错误: 替换的长度为零

请指教。

【问题讨论】:

  • 请查看更新后的代码。
  • i = 3 失败。在portret[,1] 中找不到as.character(date.list[3])。试试sum(portret[,1] == as.character(date.list[i]))。你会看到它是 0。不清楚你要做什么。您已经在 portret 中有日期。你想用 date.list 做什么?
  • 我明白了……我在为每个交易日解决 portret 的 minvar 端口所做的工作,我正在回顾并根据日期收集特定的月份值。所以我会有一排库存重量,我需要参考 portret 的日期。这可能不是解释它的最佳方式,但感谢您发现问题。
  • 那将是完美的!谢谢你的提示。我是 R 新手,所以我不知道。

标签: r loops for-loop indexing


【解决方案1】:

错误是因为条件语句评估为FALSE

即:

  x      <- 1:5
  x[[2]] <- which(FALSE) 

问题在于并非date.list 中的所有日期都在portret[, 1] 中。
相反,在你的 for 循环中试试这个:

w <- which(portret[,1]==as.character(date.list[i]),arr.ind=TRUE)
date.index[i,] <- ifelse(identical(w, integer(0)), c(NA, NA), w)

但更好的是:

date.index <- 
  sapply(as.character(date.list), function(D) 
      {w <- which(portret[,1]==D, arr.ind=TRUE);
      ifelse(identical(w, integer(0)), c(NA, NA), w)})

【讨论】:

  • 这很好用。我只需要看看我是否可以定制此代码以向上移动日期或向下移动日期(如果它是 NA)。我想我可以在代码的 ifelse 部分完成此操作。
  • 会全部读完,然后只删除带有NA 的行吗?
猜你喜欢
  • 2019-05-12
  • 2020-12-07
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2021-07-01
相关资源
最近更新 更多