2013-06-30 129 views
2

我正在使用for循环来替换使用mycons矢量的myarray元素的子集。每列中的子集将从mydates直到结束。有没有其他的for循环?替代for循环用于替换矩阵中元素的子集中元素的位于R中的元素

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] 
} 
+1

这是实际数据?或者这是一个简化版本?因为正如所写的,它既快速又可能根本不需要'for'循环,因为你似乎只是以一种相当直接的方式重新编码你的数据。 – Thomas

+0

那么,你需要帮助那个错误吗?如果是这样,请更新您的问题。或者,你是否想谈谈如何生成myarray矩阵? – Thomas

+0

@Thomas对不起,我虽然理解你的观点,但现在我不能让代码工作,如果删除'for'循环。如果你能以不同的方式帮助我生成“myarray”,我将不胜感激。 – nopeva

回答

1

你在比较的项目是不同类别的:性格和日期。 (我得到充满1的整个矩阵)

试试这个:

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

它得到一个量化的答案,我使出了使用outer和重新排列的逻辑有点创建一个矩阵“新”的价值观,然后将失败的项目回1 strating值:

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

我尝试使用mapply想我可以做这样的事情从两个序列通过“并行的项目”,但也没有办法,我可以得到“我”索引要抓住。

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, ">")] 

这是一个例证通过将相同的条件应用于<-操作的两侧来使用条件分配。它可以很快。

+0

谢谢我更新了代码。你知道这个for循环的替代吗? – nopeva

+0

我可以想到一个可能的等效调用'mapply',但我不明白你为什么需要。对于这种操作,“循环”的速度同样快。 –

+0

感谢您的帮助。我正在学习,并且经常读到,由于内存问题,建议使用矢量化而不是循环。虽然循环在这种情况下会更好,但如果不是太复杂,你会介意帮助使用“mapply”版本吗?它会让我明白它是如何工作的。 – nopeva

1

您可以使用此:

myarray <- ifelse(outer(dates, mydates, `>`), rep(mycons, each=length(dates)), 1) 
+0

感谢这样一个好的解决方案。 – nopeva