替代for循环,用R中的向量中的元素替换矩阵中的元素子集

时间:2013-06-30 09:33:36

标签: r apply tapply

我正在使用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]
}

2 个答案:

答案 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)