我正在使用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]
}
答案 0 :(得分:1)
您要比较的项目属于不同的类别:角色和日期。 (我得到一个填充了1的整个矩阵。)
试试这个:
mydates <- as.Date(mydates) # then the comparisons will more sensible
它得到了一个向量化的答案我使用了outer
并重新排列了逻辑以创建一个带有“new”值的矩阵,然后将失败的项目设置回到strating值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循环的典型重写:您几乎总是可以将for循环重构为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, ">")]
通过对<-
操作的两侧应用相同的条件来说明使用条件赋值。它可以非常快。
答案 1 :(得分:1)
您可以使用:
myarray <- ifelse(outer(dates, mydates, `>`), rep(mycons, each=length(dates)), 1)