2014-03-31 133 views
1

我有一個數據集,看起來像這樣:SAS崩潰日期

cust date 1 2 3... 600 
1 1 5 . . ... . 
1 2 5 . . ... . 
1 2 . 4 . ... . 
1 2 . . 6 ... . 
2 1 1 . . ... . 
2 1 . 5 . ... . 
2 2 . . . ... 10 

我想1崩潰變量600由客戶(卡斯特)每個日期,從而使數據集是這樣的:

cust date 1 2 3... 600 
1 1 5 . . ... . 
1 2 5 4 6 ... . 
2 1 1 5 . ... . 
2 2 . . . ... 10 

我開始用下面的代碼(也許這是一個有點複雜),它不工作:

data want ; 
set have; 
array vars &list.; *stored array of variables 1-600; 
retain count vars; 
by cust date; 
if first.date then do; 
do _i=1 to dim(vars); 
vars[_i]=.; 
end; 
count=0; 
end; 
count=count+1; 
vars[_1]=vars; 
if last.date then do; 
output; 
end; 
drop count; 
run; 

你有什麼主意?另一個想法是使用proc擴展,但它不工作,因爲日期是重複的。

非常感謝您的幫助!

回答

7

有一個巧妙的方法來實現這個使用UPDATE語句。現有表的第一個引用(obs = 0)將創建一個具有所需結構的空表,第二個引用將使用值進行更新。 BY語句確保它僅爲每個BY值輸出一條記錄。希望這是有道理的。

data have; 
input cust date v1 v2 v3 v600; 
datalines; 
1 1 5 . . . 
1 2 5 . . . 
1 2 . 4 . . 
1 2 . . 6 . 
2 1 1 . . . 
2 1 . 5 . . 
2 2 . . . 10 
; 
run; 

data want; 
update have (obs=0) have; 
by cust date; 
run; 
+1

更新,設置/合併/更新系列報表的喬治哈里森... – Joe

+0

@Joe,至少它不是皮特最好的! ;-) – Longfish

+0

@基思非常感謝你!這真是有用的聲明!完美的作品! – Tess

2

您不能在set語句中使用來自數據集的變量的RETAIN;或者更準確地說,你可以,但它不起作用 - 變量是自動設置語句變量的RETAIN。但是,當set發生時,它們也會被數據步驟的下一次迭代覆蓋。

您可以使用臨時數組來存儲保留值,並在last.date(臨時數組也可以自動保留,FYI)時複製它,也可以完全使用其他技術 - 散列表,SQL,無論您最熟悉的。

例如,

proc sql; 
create table want as 
    select cust, date, sum(var1) as var1, sum(var2) as var2, ... 
    from have 
    group by cust,date; 
quit; 

你想構建sum(var1) as var1在宏變量,像

%macro sumvar(var=) 
sum(&var.) as &var. 
%mend sumvar; 
proc sql; 
select cats('%sumvar(var=',name,')') 
    into :sumlist separated by ',' 
    from dictionary.columns 
    where libname='WORK' and memname='HAVE' and not (name in ('CUST','DATE')) 
; 
quit; 

,然後使用該& sumlist。在上面的sql。

select cust, date, &sumlist. 

這可能是最簡單的代碼;如果您的數據量非常大,它可能不像其他選項那樣高效。

2

你可以這樣類似以下內容:

proc means data=have noprint; 
    by cust date; 
    var &list; 
    output out=want(drop=_:) sum=; 
run; 
+0

好主意。除非數據保證排序(避免排序),否則可能應該將'by'更改爲'class'。 – Joe

+0

謝謝,我選擇by的原因是因爲樣本數據步驟中有一個by,所以我想它可能是排序的。 – Leo