2013-08-04 38 views
0

我有我的數據按ID和日期排序。我已將日期轉換爲單個數字,該數字已排序(年份之後的一年)。我想創建一個新的變量,它是最好分區中最小值的函數。和示例如下給定ID的最小值

ID Start listen 

1 201134 201138 

1 201204 201150 

2 200905 200910 

2 201005 201020 

我想是這樣

ID開始聽weekSincestart

1 201134 201138 4 

1 201204 201150 54 

2 200905 200910 5 

2 201005 201020 15 

所有IM做的是(listen-min(start)),但我假設min()走的是最小啓動對於一個給定ID。於是,我問,如果有一個「通過聲明」爲最小功能

回答

0

你可以很容易地用PROC SQL做到這一點:

proc sql; 
    create table RESULT as 
    select *, listen-min(start) as weekSincestart 
    from INPUT 
    group by id; 
quit; 

這將需要每個ID組的分計算分(開始)。 由於您選擇的變量不在組中,也沒有聚合函數,因此它不會將多個行聚合爲一個組。

0

你的問題有點混亂。如果你只想聽減開始(你的'結果'是什麼),那麼就這樣做。 min函數不會交叉行;在SAS中很難跨行(或者至少這是你必須有意識地做的事情)。當然,你需要弄清楚如何處理年度障礙;如果我是你,我會將日期作爲實際日期,並使用INTCK來確定週中的差異。

如果你真的這樣做需要的最低限度爲整個ID,數據跳躍溶液(不太整齊的SQL解決方案,但工作原理大致相同):

data want; 
set have; 
by id start; 
retain _initial_start; 
if first.id then _initial_start=start; 
weeksincestart=listen-_initial_start; *or whatever you intended - this does not seem right; 
drop _initial_start; 
run; 
1

在我看來沒有必要使用您擁有的方法將日期和日期值轉換爲日期。

我使用INTNX在START和LISTEN變量中使用一年中的第一天將數據轉換回日期,並在相同變量中每週增加一次。這些日期可能並不完全符合您對數據集的要求,但它應該會導致類似的情況。

如果我正確地理解了你,下面應該做你想做的事。

DATA WANT2; 
    SET HAVE; 
    BY ID START; 
    RETAIN _START; 
    FORMAT _START DATE9.; 
    IF FIRST.ID THEN _START = START; 
    WEEKSINCESTART = INTCK("WEEK",_START,LISTEN); 
RUN; 

在這種情況下你的樣品進行排序,但如果你想通過語句的處理進行識別ID的價值,你需要先整理數據集的第一個實例。 retain語句將保存一個值,並通過使用by語句來指定保留變量中的值何時被更改。在這種情況下,我們希望在遇到ID的第一個實例時更改_START變量。我使用下劃線前綴,因爲如果需要,它可以更容易地刪除這些變量。直到下一個ID的實例纔會替換該值,這意味着它將成爲ID 1的後續觀察值等等。 INTCK功能測量第一和第二期間的間隔數(在本例中爲週數),在這種情況下,對於每個觀察,在_START中捕獲的每個ID的START開始的第一個實例和LISTEN之間。

最終的結果是:

ID START  LISTEN _START WEEKSINCESTART 
1 21AUG2011 18SEP2011 21AUG2011 4 
1 29JAN2012 11DEC2011 21AUG2011 16 
2 01FEB2009 08MAR2009 01FEB2009 5 
2 31JAN2010 16MAY2010 01FEB2009 67 

我希望這是有益的。

Regards, Scott

相關問題