2

ベクトルをmyarray使用する要素のサブセットを置き換えるために for ループを使用しています。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

これを使用できます:

myarray <- ifelse(outer(dates, mydates, `>`), rep(mycons, each=length(dates)), 1)
于 2013-07-01T17:36:02.100 に答える
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

2 つのシーケンスから「並列アイテム」を渡すようなことができると考えて使用してみ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, ">")]

これは、操作の両側に同じ条件を適用して条件付き割り当てを使用する例です<-。それはかなり速いかもしれません。

于 2013-06-30T23:25:52.777 に答える