2

我正在使用 for 循环来替换myarray使用mycons向量的元素子集。每列中的子集将从mydates直到结束。有没有替代for循环的方法?

mydates <- as.Date(c('2013-06-05','2013-06-16','2013-06-22'))
mycons <- c(0.5,1/7,0.25)
dates <- seq(as.Date('2013-06-01'),Sys.Date(),"days")
myarray <- matrix(rep(1,length(dates)*length(mydates)),length(dates),length(mydates))

for (i in 1:length(mycons)) {
  myarray[which(dates>mydates[i]),i] <- mycons[i]
}
4

2 回答 2

1

您要比较的项目属于不同的类别:字符和日期。(我得到一个充满 1 的整个矩阵。)

试试这个:

 mydates <- as.Date(mydates) # then the comparisons will more sensible

它得到了一个矢量化的答案,我使用outer并重新排列了逻辑以创建一个具有“新”值的矩阵,然后将失败的项目设置回分层值 1:

myarray2 <-matrix(mycons, 
                nrow=length(dates), ncol=length(mydates), byrow=TRUE)
myarray2[  outer(dates, mydates, "<=") ] <- 1
myarray2

我试着mapply思考我可以做一些事情,比如从两个序列中传递“并行项目”,但是我无法让“i”索引占据主导地位。

mapply(function(x,y) {myarray[i , ] <- y[x>dates]} , mydates, mycons)

for-loop 的典型改造:您几乎总是可以将 for-loop 重构为一个sapply操作:

 sapply( 1:length(mycons), function(idx){ 
          myarray[which(dates>mydates[idx]),idx] <- mycons[idx]; myarray[,idx]})

我怀疑有人可以构建一个sweep可以做到这一点的操作,但我还没有真正摸索过sweep

如果您想采用@Ferdinand.Kraft 建议的构建与 myarray 长度相同的向量的路径,但要保持在范式范围内,obj[cond] <- value请执行以下操作:

 myarray[  outer(dates, mydates, ">") ] <- 
        rep(mycons, each=length(dates) )[ outer(dates, mydates, ">")]

这是通过将相同的条件应用于操作的两侧来使用条件赋值的说明<-。它可以相当快。

于 2013-06-30T23:25:52.777 回答
1

你可以使用这个:

myarray <- ifelse(outer(dates, mydates, `>`), rep(mycons, each=length(dates)), 1)
于 2013-07-01T17:36:02.100 回答