2016-11-11 10 views
0

私はプログラミング(ループなど)の技術をかなり新しくしています。これは、私のアプローチがうまくいくか、間違いなく必要かという意見を得ることができたら大変感謝しています。はるかに大きなサンプルで使用しようとしていた場合に最適化されます。データフレームの行を連続した昇順のIDでグループ化する

現在、私は約20,000の観測値を持ち、列の1つは領収書のIDです。私が達成したいのは、各行を、n + 1の形式で昇順になるIDで構成されるグループに割り当てることです。このルールが破損している場合は、ルールが再度破られるまで新しいグループを作成する必要があります。説明するために

が、私はこのテーブルを持って言うことができます(重要な注意はIDが一意である必要はありませんし、私の例では、ID 10のように、繰り返すことができることである):

MyTable <- data.frame(ID = c(1,2,3,4,6,7,8,10,10,11,17,18,19,200,201,202,2010,2011,2013)) 

MyTable 

    ID 
    1 
    2 
    3 
    4 
    6 
    7 
    8 
    10 
    10 
    11 
    17 
    18 
    19 
    200 
    201 
    202 
    2010 
    2011 
    2013 

私のグループ分けの結果は次のようする必要があります:

ID GROUP 
    1  1 
    2  1 
    3  1 
    4  1 
    6  2 
    7  2 
    8  2 
    10  3 
    10  3 
    11  3 
    17  4 
    18  4 
    19  4 
    200 5 
    201 5 
    202 5 
    2010 6 
    2011 6 
    2013 7 

私は昇順でIDを発注するためにdplyrを使いました。次に、MyData $ Groupという変数を作成しました。この変数は、1で埋めています。

rep(1,length(MyTable$ID) 

for (i in 2:length(MyTable$ID)) { 
    if(MyTable$ID[i] == MyTable$ID[i-1]+1 | MyTable$ID[i] == MyTable$ID[i-1]) { 
    MyTable$ID[i] <- MyTable$GROUP[i-1] 
    } else { 
     MyTable$GROUP[i] <- MyTable$GROUP[i-1]+1 
    } 
} 

このコードは私のために働いていて、結果はかなり簡単です。しかし、経験豊富なプログラマーの目には、このコードが「悪い」、「平均的」、「良い」などの評価を得ているのではないかと思います。

編集:このトピックはすでに触れられていると確信しています。主な違いは、ここで最適化の話題に触れて、自分のアプローチが基準を満たしているかどうかを確認することです。

ありがとうございます!

+0

を、それがRでforループを使用して – Nate

+0

良いことだ動作するかどうか、常に回避されました!しかし、初心者の視点から、それは良いです。今度は、 "apply"ファミリーのビューから考えて効率を改善しようとする –

+0

* "+1ルールを破らないようにする" *は "連続ID" *または "連続ID"と呼ばれます*また、 [タグ:rstudio]特にRStudio(IDE)と関係がない限り、この場合はそうではありません。 – smci

答えて

3

長い話を短くするには、次の

MyTable$Group <- cumsum(c(1, diff(MyTable$ID) != 1)) 
#  ID Group 
#1  1  1 
#2  2  1 
#3  3  1 
#4  4  1 
#5  6  2 
#6  7  2 
#7  8  2 
#8 10  3 
#9 11  3 
#10 12  3 
#11 17  4 
#12 18  4 
#13 19  4 
#14 200  5 
#15 201  5 
#16 202  5 
#17 2010  6 
#18 2011  6 
#19 2013  7 

あなたは1ではありません、あなたのベクトルmytableは$ ID内のすべての違いを、検索しているので、これはあなたの「休憩」です。そして、これらの値はすべてcumsumです。 cumsumが分からないときは?cumsumと入力してください。 それだけです! IDを繰り返すことで、あなたはこの使用することができます:

UPDATE

MyTable <- data.frame(ID = c(1,2,3,4,6,7,8,10,10,11,17,18,19,200,201,202,2010,2011,2013)) 
MyTable$Group <- cumsum(c(1, !diff(MyTable$ID) %in% c(0,1))) 

#  ID Group 
#1  1  1 
#2  2  1 
#3  3  1 
#4  4  1 
#5  6  2 
#6  7  2 
#7  8  2 
#8 10  3 
#9 10  3 
#10 11  3 
#11 17  4 
#12 18  4 
#13 19  4 
#14 200  5 
#15 201  5 
#16 202  5 
#17 2010  6 
#18 2011  6 
#19 2013  7 
+1

私はあなたにこの母親を連れて来る必要はないと思います:)質問を編集して、これらの繰り返しIDの例を含めることはどうですか?あなたがそれらを含まなければ人々がこれらの小さな問題を予期することは不可能です。 – Nate

+0

Nathanが書いたように...どうすればこれを知るべきですか?だから、良い再現可能な例を作ろう! –

+0

私は自分の答えを更新しました... –

関連する問題