2016-10-27 2 views
1

私は非常に単純なR問題かもしれませんが、私は検索して答えを見つけることができませんでした。私は数多くの異なる検索条件を試してきました。私はこれが以前に尋ねられている場合はお詫び申し上げます。とにかく...R:最後の値と最初の値を比較する循環ループを作成

問題は次のとおりです。最後の値と最初の値を比較して停止するループを作成するにはどうすればよいですか。

例:私は10人の夕食客が円形のテーブルの周りに座っています。私は円の周りを時計回りに進む年齢の違いを見たいと思います。人10で、私は+ 1 11、したがって、範囲外であるため、

Ages<-c(27,83,65,91,23,10,47,9,71,101) 
for(i in 1:length(Ages)){ 
Difference[i]<-Ages[i]-Ages[i+1] 
} 

は今、もちろん、これは終わりで困難に陥ります。しかし、私は、人10の年齢を人1の年齢と比較したいと思います。そして、それを止める(すなわち、無期限に丸と丸を続けない)。

また、適用機能のいずれかを使用してこれを簡単に実行できる場合は、それも機能しますが、ループは簡単です。

ありがとうございました!

答えて

1

一般的な治療はパディングです。最後にリサイクルされるセクションをパッドしてから通常通りに処理します。ご例えば

は、我々は最初の要素を再利用する必要があるので、我々は、私はまた、ベクトル化操作でループを交換した

Ages1 <- c(Ages, Ages[1]) 
-diff(Ages1) 

を行います。我々はAges[i] - Ages[i + 2]を取りたい場合は

は、我々は最初の2つの要素をリサイクルする必要があります。

Ages1 <- c(Ages, Ages[1:2]) 
-diff(Ages1, lag = 2) 

私はあまりにも、この考えていました。ベクトル/要素の繰り返し部分が必要になると思われます。それを行うにはもう少しエレガントな方法があった場合には非自明な例を用いてより複雑になるかもしれないので、私はちょうど私があなたが「エレガント」で何を意味するのか分からない

...、と思いまして。多分、モジュロ演算である%%で何かを探しているかもしれません。

i <- 1:length(Ages) 
# [1] 1 2 3 4 5 6 7 8 9 10 

j <- (i + 1) %% length(Ages) 
# [1] 2 3 4 5 6 7 8 9 0 1 

j[j == 0] <- length(Ages) ## have to replace 0 with `length(Ages)` 
# [1] 2 3 4 5 6 7 8 9 10 1 

Ages[i] - Ages[j] 

実際の設定に応じて、これはうまくいかない場合がありますが、これは適切な解決方法です。あなたはこのコードを実行すると

+0

コメントありがとうございます!ベクトル/要素の一部を手動で繰り返す必要があるようです。私はそれを行うためにもう少しエレガントな方法があるのか​​どうか疑問に思っていました。それ以来、より複雑なものになるかもしれません... – FitzKaos

+0

追加してくれてありがとう - 私はそれが私の実際のシステムにもっと当てはまると思います。助けを感謝する:) – FitzKaos

0

Ages<-c(27,83,65,91,23,10,47,9,71,101) 
for(i in 1:(length(Ages)-1)){ 
Difference[i]<-Ages[i]-Ages[i+1] 
} 
Difference[10]=Ages[10]-Ages[1] 

を私はあなたが必要な結果を得ることになると思います。

+0

ありがとう!私はそれを行うために少し優雅な方法があるかどうか疑問に思っていました。それ以来、それほど複雑ではないかもしれません... – FitzKaos

+0

さて、問題はありません!私はあなたが描いているような「循環関数」を知らない。しかし、それを行うことができます –

関連する問題