2014-05-01 80 views
3

努力獲取此If/Then/Else語句不起作用。我有兩列:變量和值。變量具有變量的名稱,Value具有可能與該變量關聯的所有潛在代碼。如果/然後/否則在SAS不工作

例子:

Variable  Value 
Gender   F 
Gender   M 

我想創建一個名爲「標誌」字段,如果值不是值的列表中,它應該標誌字段;否則,離開這個領域的空白

data Want; 
length 
Variable $40. 
Value $40. 
Flag $8.; 
set Have (keep = Variable Value); 
if (Variable = 'Gender' and Value ^= 'M') then Flag = 'UnkCode'; else Flag=""; 
if (Variable = 'Gender' and Value ^= 'F') then Flag = 'UnkCode'; else Flag=""; 
if (Variable = 'Gender' and Value ^= 'O') then Flag = 'UnkCode'; else Flag=""; 
if (Variable = 'Gender' and Value ^= 'U') then Flag = 'UnkCode'; else Flag=""; 
run; 
quit; 

我使用的數據集只對性別兩個值:F和M.無論出於何種原因,在兩條線的標誌字段有「UnkCode」

任何想法我做錯了什麼?

+0

因爲您的最後一個條件將始終與您的數據集匹配。有趣的語言雖然 – dualed

回答

4

只是,可能會更清楚一點:您的if語句是按順序評估的。因此,對於第一次觀察,標記將初始設置爲「」,如('M'='M')。但是,Flag隨後被後續的if語句覆蓋,並且('M'^ ='F'),Flag被覆蓋,並且取值爲'UnkCode'。除了Keni使用in語句(這比我將要建議的代碼更好)之外,您還可以執行以下操作(這可以幫助您更好地理解語句是否更好)。

if (Variable = 'Gender' and Value = 'M') then Flag = ""; 
else if (Variable = 'Gender' and Value = 'F') then Flag = ""; 
else if (variable = 'Gender' and Value = 'O') then Flag = ""; 
else if (Variable = 'Gender' and Value = 'U') then Flag = ""; 
else if (Variable = 'Gender') then Flag = 'UnkCode'; 

我也可能表明,而不是有一個名爲「變量」變量,以「性別」的值,你只需有一個名爲「性別」變量與「F」或「M」的值。雖然在某些特定情況下您不希望以這種方式創建數據集,但它們相對較少,而且相距甚遠。

+0

感謝您的解釋!實際上我在變量Field(「Gender」,「Race」,「Ethnicity」等)中有不同的事物,並且希望爲每個變量做一個不同的if/then聲明。如果我只是繼續重複if/then,那麼「Flag」列中的每個字段都會被輸入爲「UnkCode」(這是合理的,因爲您的解釋是它被覆蓋)。任何想法如何我可以補救這一點? (我很抱歉沒有把它放在前面;我希望只是將任何給定的代碼擴展到數據集的其餘部分) – Farah

+2

好的答案,最好解釋原始代碼的問題,而不是僅僅說'那是錯誤的, 這是對的'。 – mjsqu

3

我把所有的IF條件放在一個語句中,它工作。

data Want; 
     length Variable $40. Value $40. Flag $8.; 
     set Have (keep = Variable Value); 
     If (Variable = 'Gender' and Value in ('F','M','O','U')) then Flag =" "; 
     else Flag = 'UnkCode'; 
run; 
quit; 

對於多個變量來標記...這應該工作。

data Want; 
    length Variable $40. Value $40. Flag $8.; 
    set Have (keep = Variable Value); 
    Flag = 'UnkCode'; 
    if (Variable = 'Gender' and Value in ('F','M','O','U')) then Flag =" "; 
    else if (Variable = 'Race' and Value in ('B','A')) then Flag =" "; 
run; 
quit; 
+0

這個工程!但我仍然在努力:在變量Field(「Gender」,「Race」,「Ethnicity」等)中我確實有不同的東西,並且希望爲每個變量做一個不同的if/then聲明。如果我只是繼續按照您提供的格式重複if/then,那麼「Flag」列中的每個字段都會被輸入爲「UnkCode」。 (我很抱歉沒有把它放在前面;我希望只是將任何給定的代碼擴展到數據集的其餘部分) – Farah

+0

N/M!當我在每行之間執行其他操作時,它效果很好。非常感謝!! – Farah

+0

是的,我爲新變量添加了額外的代碼。首先聲明Flag爲unkcode,然後在檢查作品後將該值修改爲空白。 – Keni