2013-12-12 72 views
-2

可能是我遇到的最複雜的任務。 真的可以用您的幫助這裏...複雜任務,滯後和保留功能可能不夠好

比方說,我有一個數據集與此類似:

data have; 
rk = 1; 
version = 0; 
treatment_ind = 1; 
start_date_1 = "01jan2013"d; 
end_date_1 = "01feb2013"d; 
start_date_2 = "21jan2013"d; 
end_date_2 = "18feb2013"d; 
money_field = 32; 
OUTPUT; 

rk = 1; 
version = 1; 
treatment_ind = 1; 
start_date_1 = "01feb2013"d; 
end_date_1 = "01apr2013"d; 
start_date_2 = "3jan2013"d; 
end_date_2 = "9feb2013"d; 
money_field = 1; 
OUTPUT; 

rk = 1; 
version = 2; 
treatment_ind = 2; 
start_date_1 = "01jan2013"d; 
end_date_1 = "01feb2013"d; 
start_date_2 = "21jan2013"d; 
end_date_2 = "18feb2013"d; 
money_field = 65; 
OUTPUT; 

rk = 1; 
version = 3; 
treatment_ind = 3; 
start_date_1 = "01jan2013"d; 
end_date_1 = "01jun2013"d; 
start_date_2 = "21jul2013"d; 
end_date_2 = "18aug2013"d; 
money_field = 6; 
OUTPUT; 

rk = 1; 
version = 0; 
treatment_ind = 7; 
start_date_1 = "11mar2013"d; 
end_date_1 = "22may2013"d; 
start_date_2 = "21feb2013"d; 
end_date_2 = "24feb2013"d; 
money_field = 34; 
OUTPUT; 



FORMAT start_date_1 end_date_1 start_date_2 end_date_2 DATE9.; 
run; 

如果treatment_ind = 1 - 這是一個容易。一個普通的例子,所有的計算對我來說都很好。

的棘手的有如下:

如果treatment_ind = 2, 我需要做的幾件事情:

  1. 首先,在容易的任務:更新現有行的幾個字段(其中treatment_ind = 2)

  2. 每個rk擁有某處treatment_ind = 2,應以某種方式行事。

如果treatment_ind = 3,

  1. 首先,就越容易的任務:在現有行更新幾個字段(treatment_ind = 3中)

  2. 每個RK擁有某處treatment_ind = 3,應該以某種方式行事。不同的方式。

等等.... 我有采取行動以不同的方式,而不僅僅是當前行, 但每一行,由RK,擁有該指標的地方...... 8個不同的指標

其中一些實際上取消了其他指標的行爲。 例如, 如果某個RK的某處Indicator_ind = 7, 比treatment_ind = 3不應計算。

當這一切完成後, 我應該使用保留,以便從一行到另一個累積數...

主要問題是, 我無法上傳我的工作表來解釋好,我面臨的形勢, 和數據集我沒有上傳是非常簡單的,並不代表這項任務的複雜性......

如果例如, indicator_ind = 1,則日期之間的差異應該是根據第一組日期。 其他指標應按第二組計算。

同去很多很多其他的計算...

我知道這將是艱難的恐怕要回答這個...

但是,一開始,我要請方向... 因爲保留/滯後獨自不會幫助我,恐怕... ...

+0

請勿在美國公開 –

+0

下一次請不要把CAPS-LOCK放在整個標題上。如果您至少可以上傳您的數據集的樣本,則會更清楚。乾杯 –

回答

0

這可能會幫助您解決您的問題,但由於我看不到您的數據集,因此很難預測。你可以玩RETURN和SELECT語句。 RETURN跳過當前數據步驟迭代並繼續下一次迭代。 SELECT在其他編程語言中像「switch」語句一樣工作。一旦條件滿足,它只會執行該條件的後續陳述。

data work.test; 
set work.sample; 
if indicator_ind=7 and treatment_ind=3 then return; 



select; 
    when(treatment_ind = 1 and version = 0) do; 

    rk = 1; 
    start_date_1 = "01jan2013"d; 
    end_date_1 = "01feb2013"d; 
    start_date_2 = "21jan2013"d; 
    end_date_2 = "18feb2013"d; 
    money_field = 32; 
    OUTPUT; 
    end; 

    when(treatment_ind = 1 and version = 1) do; 

    rk = 1; 
    start_date_1 = "01feb2013"d; 
    end_date_1 = "01apr2013"d; 
    start_date_2 = "3jan2013"d; 
    end_date_2 = "9feb2013"d; 
    money_field = 1; 
    OUTPUT; 
    end; 

    when(treatment_ind = 2 and version = 2) do; 

    rk = 1; 
    start_date_1 = "01jan2013"d; 
    end_date_1 = "01feb2013"d; 
    start_date_2 = "21jan2013"d; 
    end_date_2 = "18feb2013"d; 
    money_field = 65; 
    OUTPUT; 
    end; 


    when(treatment_ind = 3 and version = 3) do; 

    rk = 1; 
    start_date_1 = "01jan2013"d; 
    end_date_1 = "01jun2013"d; 
    start_date_2 = "21jul2013"d; 
    end_date_2 = "18aug2013"d; 
    money_field = 6; 
    OUTPUT; 
    end; 

    when(treatment_ind = 7 and version = 0) do; 

    rk = 1; 
    start_date_1 = "11mar2013"d; 
    end_date_1 = "22may2013"d; 
    start_date_2 = "21feb2013"d; 
    end_date_2 = "24feb2013"d; 
    money_field = 34; 
    OUTPUT; 
    end; 

    otherwise; 
end; 

FORMAT start_date_1 end_date_1 start_date_2 end_date_2 DATE9.; 
run;