2016-03-02 67 views
0

我有一個實驗室結果數據集。每行對應一個主題的時間點(例如:第1行是他第一次訪問時的主題#1,第2行是他第二次訪問時的主題#1)。在每一行中,我有5個測試(test1,test2,...)的值,並且對於每個測試,除了結果之外,還有測試的兩列參考值(正常低和高等級)。我希望對數據進行轉置,使得每行對於主題+訪問+測試都是相同的,並且具有兩列,即數字結果和狀態(正常與否)。我無法轉移數據。我設法以長格式獲取所有測試,但無法保存參考值。我應該怎麼做?我的選擇是一組if語句,它會很長!SAS中的數據轉換

+0

請你可以發佈一些你有什麼和你想要的樣本數據,以及你已經試過的代碼。 – Longfish

回答

1

這個問題也發佈在communities.sas.com上。 這兩步過程從名稱中提取有關PARAMCD(實驗室測試代碼)和變量類型(值和正常範圍限制)的數據。 PARAMCD變成一個新的行ID變量,V L和H用於在數據再次轉換爲或多或少(CDISC SDTM)格式時創建新的變量名稱。

data A; 
    input ID Visit Group Test1 Test2 Test3 Test1_L Test1_H Test2_L Test2_H Test3_L Test3_H; 
    datalines; 
1 1 0 5 3 6.7 1 10 2 7 3 9 
1 2 0 5.5 3.8 8.7 1 10 2 7 3 6 
1 3 0 4.5 2.8 5.7 1 10 3 7 3 6 
2 1 1 5 3 6.7 1 10 2 7 3 9 
2 2 1 5.5 3.8 8.7 1 10 2 7 3 9 
2 3 1 4.5 2.8 5.7 1 10 2 7 3 9 
;;;; 
    run; 
proc print; 
    run; 
proc transpose data=a out=b; 
    by id visit group; 
    run; 
data b; 
    set b; 
    length paramcd $8 namecd $1; 
    call scan(_name_,1,p,l,'_'); 
    paramcd = substrn(_name_,p,l); 
    namecd = coalesceC(substrn(_name_,p+l+1),'V'); 
    drop p l _name_; 
    run; 
proc sort data=b; 
    by id visit group paramcd; 
    run; 
proc format; 
    value $namecd 'V'='Value' 'H'='High' 'L'='Low'; 
    run; 
proc transpose data=b out=c(drop=_name_); 
    by id visit group paramcd; 
    id namecd; 
    format namecd $namecd.; 
    var col1; 
    run; 
data c; 
    set c; 
    length RangeFL $1; 
    if  n(low,value) eq 2 and value lt low then RangeFL='L'; 
    else if n(high,value) eq 2 and value gt high then RangeFL='H'; 
    else            RangeFL='N'; 
    run; 
proc print; 
    run;