2016-07-05 154 views
0

我有一些數據,看起來像這樣第一和最後一個功能SAS

data example1;  
    input Activity $ logflag; 
    Activity1 1 
    Activity2 1 
    Activity3 1 
    Activity4 1 
    Activity1 2 
    Activity2 2 
    Activity3 2 
    Activity1 3 
    Activity2 3 
    Activity3 3 
    Activity4 3 
    Activity1 4 
    Activity2 4 
    ; 
run; 

凡基本上每次變量「logflag」增量1「活動」返回到「活動1」但是,我想要去這個;

data example2;  
    input Activity $ logflag count; 
    Activity1 1 1 
    Activity2 1 2 
    Activity3 1 3 
    Activity4 1 4 
    Activity1 2 1 
    Activity2 2 2 
    Activity3 2 3 
    Activity1 3 1 
    Activity2 3 2 
    Activity3 3 3 
    Activity4 3 4 
    Activity1 4 1 
    Activity2 4 2 
    ; 
run; 

。由此我有一個「計數」,其通過1每一個新的「活動」出現某種「logflag」內的時間增量。

我正在使用的是這個;

data AS2.TENMAY_EXAMPLE4; 
    set AS2.TENMAY_SESSIONID; 
    by logflag Activity notsorted; 
    if first.logflag then count=0; 
    if first.Activity then count+1; 
run; 

和我得到這個

data example2;  
    input Activity $ logflag count; 
    Activity1 1 1 
    Activity2 1 2 
    Activity3 1 2 
    Activity4 1 2 
    Activity1 2 1 
    Activity2 2 2 
    Activity3 2 2 
    Activity1 3 1 
    Activity2 3 2 
    Activity3 3 2 
    Activity4 3 2 
    Activity1 4 1 
    Activity2 4 2 
    ; 
run; 

我不能明白的是爲什麼由1計數器遞增,那麼轉到2,但此後再也沒有獲得爲3或更高。我確信我有這個工作,但我無法弄清楚我改變了什麼。

任何人都可以提供幫助嗎?

感謝,

+1

檢查並確保您的輸入數據集不具有變量COUNT。 – Tom

+0

Hi @Tom。謝謝。這實際上是個問題。爲什麼我的輸入中包含一個名爲COUNT的變量很重要? – Taylrl

回答

1

您必須已經在輸入數據集中有一個名爲COUNT的變量。 因此,每次SET語句運行時,來自輸入數據集的值都會覆蓋前一個觀測值。

爲了得到你的例子,COUNT對每個觀察值可能都是1。因此,當ACTIVITY更改時遞增時,它將變爲2.每個LOGFLAG組的第一個觀察值爲1,因爲在將其增加之前首先將其設置爲0。

0

輸入數據:

data example1; 
    attrib Activity format = $20. 
     logflag format = 8.; 
    input Activity $ logflag; 
    Activity1 1 
    Activity2 1 
    Activity3 1 
    Activity4 1 
    Activity1 2 
    Activity2 2 
    Activity3 2 
    Activity1 3 
    Activity2 3 
    Activity3 3 
    Activity4 3 
    Activity1 4 
    Activity2 4 
    ; 
run; 

要拍攝的結果,你想試試這個什麼:

data example2; 
    set example1; 
    by logflag Activity notsorted; 
    if first.logflag then count=1; 
    else count+1; 
run; 

結果是:

Activity logflag count 
--------- ------- ----- 
Activity1 1  1 
Activity2 1  2 
Activity3 1  3 
Activity4 1  4 
Activity1 2  1 
Activity2 2  2 
Activity3 2  3 
Activity1 3  1 
Activity2 3  2 
Activity3 3  3 
Activity4 3  4 
Activity1 4  1 
Activity2 4  2 

enter image description here

+0

我運行了這段代碼,它仍然給了我同樣的東西,從而計數不會增加任何高於2.我可以看到你的代碼在這裏應該工作,就像我上面使用的代碼。我很困惑。 – Taylrl

+0

@Taylrl,這真是太棒了:) –

+0

在這裏發生了一件非常奇怪的事情。我的結果與你的不同。我將調查並報告:-S – Taylrl

0

您缺少retain聲明。每次datastep循環變量被重置。 Retain可以抑制這種行爲。

data AS2.TENMAY_EXAMPLE4; 
    set AS2.TENMAY_SESSIONID; 
    retain count; 
    by logflag Activity notsorted; 
    if first.logflag then count=0; 
    count+1; 
run; 
+0

謝謝@Jetzler,但是即使使用這個'retain'聲明,我仍然會得到相同的結果,伯爵不會增加過去2.所有在這裏我會認爲應該已經工作的解決方案。必須有我們缺少的東西 – Taylrl

+1

是的,沒錯。剛剛檢查過它。使用總和函數'x + y;'具有內建保留。所以它應該一直工作。因此,問題必須出現在您的輸入數據或您系統的設置中。 – Jetzler

相關問題