您要比较的项目属于不同的类别:字符和日期。(我得到一个充满 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, ">")]
这是通过将相同的条件应用于操作的两侧来使用条件赋值的说明<-
。它可以相当快。