2012-07-18 14 views
15

私はFIRSTのための直接的なR翻訳を徹底的に探しました。そして最後。 SAS DATAのステップのポインタが見つかりません。 SAS、FIRSTに精通していない人のために。テーブルとLAST内の特定の要素の最初の出現を識別するブール値です。最後の外観を識別するブール値です。たとえば、以下のソートテーブルを考えてみます。data.frameの要素の最初と最後の出現を見つける方法はありますか?

V1 V2 V3 
1  1  1 
1  1  2 
1  2  3 
1  2  4 
2  3  5 
2  3  6 
2  4  7 
2  4  8 
3  5  9 
3  5  10 
3  6  11 
3  6  12 

SAS DATAステップはラインによって、テーブルの行を読んでいるので、私はのようなステートメントを使用することができます。

IF FIRST.V1 THEN DO ... 

と場合にのみ場合FIRST.V1はTRUEを返しますV1で観測が発生したのはこれが初めてです。言い換えれば、V1 [1](最初の出現は '1')、V1 [5](最初の出現は '2')、V1 [9](最初の出現は '3' )。最後。ポインタは類似の方法で機能しますが、その要素の最終的な外観を持ちます。

Rにこれをエミュレートするものはありますか?

+0

たぶん '重複()'?しかし、実際の目標が何であるかを実際に教えてくれていないので、伝えるのは難しいです。 – joran

+0

データセットを一度にループするのではなく、もっと多くのR-ish解(例えば 'ddply ')があるかもしれません... –

+0

私は実際にdata.frameを1行ずつループしたくありません。私はそれがその列の値の最初の出現である場合はtrueを返し、そうでない場合はfalseを返す関数が必要です。また、値の最後の出現である場合にのみtrueを返し、それ以外の場合はfalseを返します。以下のSpacedmanのソリューションは、これらの目的には十分以上のものです。 – asteri

答えて

21

あなたは重複して(LAST用)REVでこれを行うことができます。

> v1=c(1,1,1,2,2,3,3,3,3,4,4,5) 

> data.frame(v1,FIRST=!duplicated(v1),LAST=rev(!duplicated(rev(v1)))) 
    v1 FIRST LAST 
1 1 TRUE FALSE 
2 1 FALSE FALSE 
3 1 FALSE TRUE 
4 2 TRUE FALSE 
5 2 FALSE TRUE 
6 3 TRUE FALSE 
7 3 FALSE FALSE 
8 3 FALSE FALSE 
9 3 FALSE TRUE 
10 4 TRUE FALSE 
11 4 FALSE TRUE 
12 5 TRUE TRUE 
+0

それは素晴らしいです!どうもありがとうございました。 – asteri

+5

最後のものは、次のようにして見つけることもできます: 'LAST =!duplicated(v1、fromLast = TRUE)' –

関連する問題