2016-05-31 72 views
0

我收到了一個扁平化文件,該文件保留有關重複ID記錄的信息,而不是附加變量,而不是附加記錄。SAS - 比較變量內容和標記變化

例如,下面的數據集:

ResID VarA VarB 
XAB2 Red 13 
XAB2 Ylw 13 
BGH3 Grn 14 
FHT1 Prp 13 
XAB2 Blu 13 

都被拒絕在此:

ResID VarA_1 VarA_2 VarA_3 VarB_1 VarB_2 VarB_3 
XAB2 Red  Ylw  Blu  13  13  13 
BGH3 Grn      14 
FHT1 Prp      13 

正如你所看到的,ID爲「XAB2」相關聯的所有變量被夷爲平地成一個記錄,所以所有的信息都可以保留,但數據集仍然可以作爲一個人級文件來處理。

這很酷。但是現在我需要調和二人之間的差異。

目前我打算寫一系列非常無聊的if/else if語句在數據步驟,如:

 if VarA_2 NE " " and VarA_2 EQ VarA_1 then FLAG_VarA_dup = 0; 
else if VarA_2 NE " " and VarA_2 NE VarA_1 then FLAG_VarA_dup = 1; 
else if VarA_3 NE " " and VarA_3 EQ VarA_2 then FLAG_VarA_dup = 0; 
else if VarA_3 NE " " and VarA_3 NE VarA_2 then FLAG_VarA_dup = 1; 

/*...etc. for all VarB occurrences, and all other variables in my very wide DS*/ 

一旦我被標記的變量在其中的DUP住的話我可以比較相關變量並做出關於應該保留或深入研究的決定。但我不禁覺得有一個更優雅或有效的方式來做到這一點。我很想在這裏學習一兩件事。

更好的解決方案的任何建議?

回答

2

如果您只是想知道VarA_#是否具有除第一個以外的任何值,那麼您可以使用tranwrdcountw來驗證這一點。基本上,要求SAS將您的VarA_#設置爲由您選擇的分隔符分隔的單個字符串,然後使用tranwrd將第一個變量值的所有副本轉換爲丟失。然後計算剩餘字符串中的字數 - 0意味着您只有第一個值,1或更高意味着您有一些不同的值。

data have; 
    infile datalines truncover; 
    input ResID $ VarA_1 $ VarA_2 $ VarA_3 $ VarB_1 VarB_2 VarB_3; 
datalines; 
XAB2 Red  Ylw  Blu  13  13  13 
BGH3 Grn  Grn  .   14  14 
FHT1 Prp  .  .   13 
;;;; 
run; 

data want; 
    set have; 
    array varA_[3]; 
    count_a = countw(catx(' ',of varA_[*])); 
    count_a_diff = countw(tranwrd(catx(' ',of VarA_[*]),trim(varA_1),' ')); 
run; 
+1

爲避免匹配單詞的部分,需要在TRANWRD()函數調用中爲兩個參數添加分隔符。儘管它的名字TRANWRD()不知道一個詞是什麼。 – Tom

+1

@Tom如果數據中可能有部分詞匹配,這是一個很好的觀點。我現在不打算在答案中解決這個問題,如果你想這樣做,請隨時(在你自己的答案或以上)免費。 – Joe