2016-08-01 66 views
-6

請任何人都可以幫助我下面的問題。找到號碼列數改變編號

我有以下的僞數據:

id num 
1 1 
1 2 
1 1 
1 2 
1 1 
1 2 
2 1 
2 15 
2 1 
2 1 
2 1 
2 15 
2 1 
2 15 

如何計算時間NUM(列)的數量正在改變每個ID? 請找到結果和新欄目。 這樣

id number no_of_times 
1 1  1 
1 2  1 
1 1  1 
1 2  2 
1 1  1 
1 2  3 
2 1  1 
2 15  1 
2 1  1 
2 1  1 
2 1  1 
2 15  2 
2 1  1 
2 15  3 

我需要的結果,希望你能看到的結果

後才明白
+1

從樣本數據你已經提供了,不清楚你想要使用什麼邏輯。請你用文字解釋一下嗎? – user667489

+0

爲什麼no_of_times在你的例子中前3個觀察值不是「1 2 1」? – superfluous

+0

嗨 這裏它喜歡回來了。 1回來了,2是前進 我們只需要計算它的次數,它會前進多少次。 每個ID: 所以當它是第一次改變爲1〜2是指沒有進行1次1和2 1 如果它進入到後(1)1,這意味着沒有變化,但其值是1 ,如果它如果它回到(1)1意味着沒有變化,但值爲1,則再次以1到2表示第二次出現(2),因此1爲1和2爲2 再次1到2,這意味着第二次它將前進(2)所以值1爲1和2爲3 希望它是有道理的。 謝謝 – Ramu

回答

0

以下哈希方法適用於提供與問題的測試數據:

data have; 
input id number no_of_times_target; 
cards; 
1 1  1 
1 2  1 
1 1  1 
1 2  2 
1 1  1 
1 2  3 
2 1  1 
2 15  1 
2 1  1 
2 1  1 
2 1  1 
2 15  2 
2 1  1 
2 15  3 
; 
run; 

data want; 
    set have; 
    by id; 
    if _n_ = 1 then do; 
    length prev_number no_of_times 8; 
    declare hash h(); 
    rc = h.definekey('number','prev_number'); 
    rc = h.definedata('no_of_times'); 
    rc = h.definedone(); 
    end; 
    prev_number = lag(number); 
    if number > prev_number and not(first.id) then do; 
    rc = h.find(); 
    no_of_times = sum(no_of_times,1); 
    rc = h.replace(); 
    end; 
    else no_of_times = 1; 
    if last.id then rc = h.clear(); 
    drop rc prev_number; 
run;