2017-10-17 74 views
2

此代碼給出錯誤「期望整數常量」。爲什麼?這很簡單,我找不到任何說in()不能用小數的東西。我需要在某個地方「做」嗎?謝謝。IN函數不能使用小數點

data clustered; 
    set combd; 

if (avpm in(393821:450041) or avpm in(337601:393821) or avpm in  
    (225161:281381)) and fsp in (.8768:1) then class='1'; 

if (avpm in(112720:168940) or avpm in(56500:112720) or avpm in 
    (280.06:56500)) and fsp in (.8768:1) then class='2'; 

if avpm in(280.06:56500) and (fsp in (.507:.6303) or fsp in (.3838:.507) 
    or fsp in (.2606:.3838)) then class='3'; 

if avpm in(280.06:56500) and (fsp in (.1373:.2606) or fsp in 
    (.0141:.1373)) then class='4'; 

if avpm in(280.06:56500) and fsp in (.8768:1) then class='5'; 

if avpm in(280.06:56500) and (fsp in (.8768:1) or fsp in (.7535:.8768) or 
    fsp in (.6303:.7535)) then class='6'; 

run; 

回答

1

IN不帶有小數工作。

事實上,IN可能不會做你認爲它的作用。

IN()是一個操作符,做以下,根據SAS documentation on operators

等於1的列表的

list注意。也就是說,並不是說數字在開始和結束之間;相反,它將開始和結束作爲整數列表進行擴展並評估它是否在該列表中。您可以在The IN operator in numeric comparisons的下一頁看到:

您可以使用簡寫符號來指定要搜索的順序整數範圍。通過使用語法M:N作爲要搜索的列表中的值來指定範圍,其中M是下限,N是上限。 M和N必須是整數,並且M,N和M和N之間的所有整數都包含在範圍內。

重要的是,任何數量的不是一個整數是由不包括在此範圍定義。所以:

3.5 in (2:4) 

是錯誤的,因爲3.5不在列表中(2,3,4)

data test; 
    x = 3.5; 
    y = x in (2:4); 
    put x= y=; 
    stop; 
run; 

x=3.5 y=0 

您需要使用ge和/或le(或gt和/或lt)做你想要什麼。

0.8768 le fsp le 1 

您可以將它們鏈接在一起,因此它仍然相對容易編寫。

+0

謝謝喬;說得通。 – mbs23

+0

in運算符使用十進制數字列表,如果它們是離散指定的,例如'如果x等於0.5,如果x in(0,0.5,1)'將爲真。儘管如此,你無法真正期望SAS與無數的無限數字相匹配。 – david25272