2017-06-16 32 views
0

我有一個數據集,每個ID按日期排序有多個行。 我想爲每行分割我的數據集,並將第n + 1行日期的值放入第n行的另一列中。如果ID只有一行,則該值已經被定義。然後,我想分割我的數據集爲計數= 1,然後計數= 2,等等...我怎麼能做到這一點在SAS?如何在SAS中每個ID有多個行的情況下將第n + 1個值從變量放入第n行的另一列中?

ID date end_period  age_end count 
    1 n  n+1    value 1 
    1 n+1  N+2    value 2 
    1 N+2  n+3    value 3 
    1 n+3  value(age_end) value 4 
    2 n  value(age_end) value 1 
+0

所以這是一個展望未來的問題?你想計算end_period?我建議你展示你要開始的數據(用真實的實際值,而不是n + 1等),並顯示你想創建的數據。聽起來你可能想創建end_period變量,然後創建四個輸出數據集? – Quentin

回答

0

正如昆汀提到的,在看到一些樣本數據的時候很難說。我有點理解他們提到你需要創建2個字段。如果,和一個巨大的IF,你的日期是一個SAS日期,那麼你可以簡單地做到這一點...

end_period = date + 1; 

如果不是的話,我會建議一個號碼或文字轉換爲SAS日期。

如果Count是不是在你的數據集,然後簡單地分類和按組處理這樣可以很容易地計算字段

data dsn_final; 
    set dsn_name; 
    by ID Date; 
    if first.ID then Count=1; 
    else Count+1; 
run; 

最後分解爲單獨的數據集。如果存在未知的最大數量...意味着您不知道數據集中任何ID的最大行數是否過大或可能更改,那麼我建議使用宏創建單獨的數據數據集。首先找到最大值並將其存儲在一個宏變量中。然後將基於計數的數據集拆分爲最大計數。

proc sql noprint; 
    select max(count) 
      into: max_count 
    from simulate; 
quit; 

%put &max_count.; 

%macro datasets; 
data %do count=1 %to &max_count; 
     date&count. (drop=count) 
    %end; ; 
set simulate; 
    %do count=1 %to &max_count; 
     if count = &count. then output date&count.; 
    %end; 
run; 
%mend; 
%datasets; 

如果用數據的樣本進行迴應則有可能是更容易的方法,但我的理解,你需要計算2場,然後分裂。如果你知道最大值,分割將更容易。我只會使用宏,如果它是未知的或可能在未來使用和數據更改最大數量可能會改變。

相關問題