2011-10-12 8 views
10

誰かがより洗練されたソリューションを持っているかどうかを確認したい。ただし、適用を使用している間、現在の索引を追跡する適切な方法は何ですか。たとえば、ベクトルの最後まで進む評価中の現在の要素からのみ合計を取りたいとします。適用時の現在のインデックスの把握

これを行う最も良い方法ですか?

y = rep(1,100) 
apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])}) 

ご了承ください。

答えて

8

これは、より多くのsapplyためのタスクのようになります。あなたの具体的な例について

sapply(seq_along(y), function(x){sum(y[x:length(y)])}) 

、そこ(ベクトルyを逆転し、その後cumsumを使用してのような)他のオプションの負荷がありますが、私はこれが一般的だと思いますパターン: seq_alongまたは最悪の場合seqを使用して、目的のシーケンスを取得し、これを*applyに渡します。

+1

議論されている問題の明確化のためのちょっとした質問:索引が必要な場合、forループはより実用的ではありませんか?それともここでポイントを逃していますか? – ROLO

+2

@ROLO: '* apply'ファミリの関数は、結果に対して非常に合理的なメモリ処理を提供することができ、' simplify = TRUE'の場合は実用的な形式で格納します。歴史的にも、それは「通常の」ループよりもはるかに高速であったが、それはもはや真実ではない。だから、単純なケースでは、それほど重要ではありません。 –

+0

私はcumsumの提案のために – Thierry

3

rev(cumsum(y))は現在のインスタンスに速く多くのことを次のようになります、例はやや不幸だったかもしれ

> y = rep(1,100000) 
> system.time(apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])})) 
    user system elapsed 
88.108 88.639 176.094 
> system.time(rev(cumsum(y))) 
    user system elapsed 
    0.002 0.001 0.004 
0

まあ、しかし、問題はどのようにインデックスについて学ぶために、「適用」の機能でまたはwhile 「サプリー」は未回答のままです。外側の変数(おかげで、ステファン)を参照するためのトリック - あなたが見てみたいことがあり

何かが「< <」もかかわらず、私も不幸だ

x <- 0 
l <- 1:10; names(l) <- letters[l] 
sapply(l,function(Y) { 
    x <<- x+1 
    a<-sum(x:length(l)) 
    cat("I am at ",names(l)[x]," valued ",a,".\n",sep="") 
    return(a) 
}) 

です。特に並行して実行しているときは、サプリーのインデックスまたはx/yの位置を要求するか、または適用する意味を明白に表現したいと考えています。より良いアイディアが大歓迎です。