2013-03-28 86 views
0
匹配

我的數據是這樣的,如何一個觀察在同一列中的另一觀察SAS

S. No AB001A AB0002A AB362 VAR1 VAR2 VAR3 SUM %Match Rank 
    1 -/-  C/C A/A       
    2 C/C  C/C A/A       
    3 C/C  C/C A/A       
    4 C/C  C/C A/A       
    5 C/C  C/C A/A       
    6 C/C  C/C A/A       
    7 C/C  C/C A/A       
    8 -/-  -/- -/-       
    9 C/C  C/C A/A       
    10 C/C  C/C A/A       
    11 -/-  C/C A/A       
    12 C/C  C/C A/A       
    13 C/C  C/C A/A       
    14 C/C  C/C A/A       
    16 C/C  -/- A/A       
    17 -/-  C/C A/A       
    18 C/C  C/C A/A       
    19 C/C  C/C A/A       

我想與OBS 2匹配OBS 3,如果完全匹配然後比分將是1否則爲0 ,這將被存儲在VAR1爲AB001a,在var2爲ab0002a和在VAR3爲ab362,我想計算所有1和觀察匹配百分比和他們的排名(前十匹配者)的總和, 我成功地在Excel中做到了這一點,但它花了我很多時間,我使用如果條件在Excel中(=如果(A3 = A $ 2,1,0),然後我在所有obs中拖動,並且我做了所有obs的總和,它們的%匹配和等級 我的問題是我該如何在sas中做這件事?我可以使用陣列這是爲什麼?或在循環和數組的組合?我的數據很大,有5,15,567個obs。 任何人都可以指導我如何在SAS中做到這一點,因爲我想減少我的時間來分析我的數據。 感謝你 關心,

+0

你可以嘗試解釋一下,希望你的努力實現,因爲我不明白結果應該如何。你想計算一列中每個值的出現次數,然後運行一些統計數據嗎? –

回答

0

如果你只總結3個變量,你不需要使用循環或數組,如果你只是總結3個變量,儘管如果還有更多的變量我會使用一個數組。我正在使用LAG功能來執行此任務,但它確實需要一定的護理來確保它按照您的要求工作。確保你不使用IF ... THEN ... ELSE語句。我已經計算了除Rank之外的所有摘要統計信息,因爲我不確定您要排名的變量。如果您在在線文檔中查看PROC RANK,那麼您應該能夠確定要做什麼。 希望這有助於。

data have; 
input S_No AB001A $ AB0002A $ AB362 $; 
datalines; 
    1 -/-  C/C A/A       
    2 C/C  C/C A/A       
    3 C/C  C/C A/A       
    4 C/C  C/C A/A       
    5 C/C  C/C A/A       
    6 C/C  C/C A/A       
    7 C/C  C/C A/A       
    8 -/-  -/- -/-       
    9 C/C  C/C A/A       
    10 C/C  C/C A/A       
    11 -/-  C/C A/A       
    12 C/C  C/C A/A       
    13 C/C  C/C A/A       
    14 C/C  C/C A/A       
    16 C/C  -/- A/A       
    17 -/-  C/C A/A       
    18 C/C  C/C A/A       
    19 C/C  C/C A/A 
; 
run; 

/* count number of variables starting with AB */ 
proc sql noprint; 
select (count(*) into :num_ab 
from dictionary.columns 
where libname='WORK' and upper(memname)='HAVE' and name eqt 'AB'; 
quit; 

%put numvars = &num_ab.; 

data want; 
set have; 
array mole{&num_ab.} AB: ; 
array newvar{&num_ab.} var1 - var%left(&num_ab.); 
do i=1 to dim(mole); 
    newvar{i} = (mole{i}=lag(mole{i})); 
end; 
sumvar=sum(of var1-var%left(&num_ab.)); 
match_pc=sumvar/&num_ab.; 
drop i; 
run; 
+0

嗨親愛的基思非常感謝您對我qurey的回覆。我有超過384個變量,我在查詢中僅提到了3個用於理解目的的變量。我認爲寫384個觀察對我來說需要很多時間,我正在嘗試用proc來排練這對我有幫助嗎?基本上這是分子數據,在這裏植物樣品用384個分子標記探針在他們的DNA上進行指紋識別,以查看它們之間的差異。我請你繼續討論。 – user2134713

+0

我已經改變了我的答案,以避免硬編碼變量,假設它們都以'AB'開始 – Longfish

相關問題