2013-04-17 40 views
0

我有一個數據集,它由一系列由不同人員/儀器,一堆不同維度組成的讀數組成。它看起來像這樣:通過比較其他人創建新變量

SUBJECT DIM1_1 DIM1_2 DIM1_3 DIM1_4 DIM1_5 DIM2_1 DIM2_2 DIM2_3 DIM3_1 DIM3_2 
1  1  .  1  1  2  3  3  3  2  . 
2  1  1  .  1  1  2  2  3  1  1 
3  2  2  2  .  .  1  .  .  5  5 
...  ... ... ... ... ... ... ... ... ... ... 

我的真實數據集包含大約190尺寸,在每一個

多達5項措施我必須遵守一套規則,以創建一個新的變量爲每個維度:

  • 如果在同一維度中有兩個不同的值(不包括錯誤),則新變量缺失。
  • 如果所有值相同(不包括錯誤),則新變量採用相同的值。

我的新的變量應該是這樣的:

SUBJECT ... DIM1_X DIM2_X DIM3_X 
1  ... .  3  2 
2  ... 1  .  1 
3  ... 2  1  5 

這裏的問題是,我沒有相同數量的每個維度的措施。另外,我只能想出很多IF(我的意思是很多,因爲給定維度中的更多度量增加了比較次數),所以我想知道是否有更簡單的方法來處理這個特定的問題。

任何幫助將是apreciated。 在此先感謝。

回答

2

最簡單的方法是將其轉置爲垂直(每DIMx_y一行),總結,然後設置要缺少的缺失,然後重新轉換(如果需要重新合併)。

data have; 
input SUBJECT DIM1_1 DIM1_2 DIM1_3 DIM1_4 DIM1_5 DIM2_1 DIM2_2 DIM2_3 DIM3_1 DIM3_2; 
datalines; 
1  1  .  1  1  2  3  3  3  2  . 
2  1  1  .  1  1  2  2  3  1  1 
3  2  2  2  .  .  1  .  .  5  5 
;;;; 
run; 

data have_pret; 
set have; 
array dim_data DIM:; 
do _t = 1 to dim(dim_Data); *dim function is not related to the name - it gives # of vars in array; 
dim_Group = scan(vname(dim_data[_t]),1,'_'); 
dim_num = input(scan(vname(dim_data[_t]),2,'_'),BEST12.); 
dim_val=dim_data[_t]; 
output; 
end; 
keep dim_group dim_num subject dim_val; 
run; 

proc freq data=have_pret noprint; 
by subject dim_group; 
tables dim_val/out=want_pret(where=(not missing(dim_val))); 
run; 

data want_pret2; 
set want_pret; 
by subject dim_Group; 
if percent ne 100 then dim_val=.; 
idval = cats(dim_Group,'_X'); 
if last.dim_Group; 
run; 

proc transpose data=want_pret2 out=want; 
by subject; 
id idval; 
var dim_val; 
run; 
+0

非常感謝!那正是我所期待的。 – Rub