2014-12-04 34 views
0

下面是我正在做的一個示例。我想獲取數據集的子集(即在Alphabet列中包含這些字母的行)。我只想選擇Transport_company是現代,豐田或福特的記錄。SAS:如果列中的值在數組中

Data arrayInIf; 
set OldTable; 
array Car_array {3}a b c('Hyundai', 'Toyota', 'Ford'); 
If Transport_company ^= Car_array 
Then 
    Delete; 
Run; 

怎麼了?我如何得到這個工作。

好了,所以採樣數據將是:

  • 郵編Transport_Company號販售
  • 12345現代10
  • 90145 NASA 50
  • 20202豐田30
  • 40002哈雷5
  • 10000福特15

所以,我只想保留與汽車公司有關的所有行

+0

您可以發佈數據樣本,這將有助於答案貢獻。 – 2014-12-04 06:22:02

回答

1

Robbie的,如果你的數據是不是已經在一個數組,你不應該使用陣列的方法,因爲它增加了額外的複雜性權利 - 以罰款。

然而,如果它是以陣列已經,whichc(或whichn爲數字)是一個很好的解決方案。

data oldtable; 
input Zip Transport_Company $ No_Sold; 
datalines; 
12345 Hyundai 10 
90145 NASA 50 
20202 Toyota 30 
40002 HarleyDavidson 5 
10000 Ford 15 
;;;; 
run; 

Data arrayInIf; 
    set OldTable; 
    array Car_array{3} $ ('Hyundai', 'Toyota', 'Ford'); 
    If whichc(transport_company,of car_array[*])=0 
    Then 
    Delete; 
Run; 

在一般情況下,最好方式要做到這一點是建立一個格式。查找PROC FORMAT CNTLIN如何從數據集中執行此操作;或者你可以在代碼中做到這一點:

proc format; 
    value $automakerF 
    'Hyundai','Toyota','Ford'=1 
    other=0; 
quit; 

data fmtInIf; 
    set oldtable; 
    if put(transport_company,automakerF.) ne '1' 
    then delete; 
run; 

這有從你的代碼中分離數據的價值,再加上你可以從一個數據集,如果你想使汽車製造商名字的;同樣,你也可以用一種格式來完成你所有的不同行業。它的速度也非常快,比一堆if語句或in語句更快。

+0

通過在數據步驟中將'if ... then delete'更改爲'where語句,可以更快地實現第二種方法。 – 2014-12-04 15:22:36

1

我想你不需要在這裏使用數組。如果您只想根據多個值選擇行,請使用in關鍵字。 SAS中的數組概念與其他一些編程語言不同,後者通常將數組看作一組字符串和數值。 SAS中的數組存儲一組列(變量)。

data b; 
set a; 
where Transport_Company in ('Hyundai', 'Toyota', 'Ford'); 
run; 

輸出:

Obs  Zip  Transport_Company  Sold 
    1  12345  Hyundai    10 
    2  20202  Toyota    30 
    3  10000  Ford     15 

由於@alex在他的評論中已經提到的,如果您需要過濾基於一個長長的清單上排,where...in()會成爲累贅。在這種情況下,我的解決方案通常會使用這些名稱創建一個新集。

Transport_Company 

Hyundai 
Toyota 
Ford 
... 
BMW 

然後用proc sql做一個簡單的僞合併(條件選擇)。這應該相當快。

proc sql; 
    create table c as 
    select a.* from a, cars where a.Transport_Company = cars.Transport_Company; 
quit; 
+0

一般來說,使用'where Transport_Company in ...'比'if ...'更有效,因爲前者只會從匹配條件的輸入數據集中讀取記錄,而後者將讀取所有記錄,然後讀取子集。 – 2014-12-04 15:24:43

+0

另外請注意,如果提供的樣本數據是一個玩具的例子,並且實際上考慮了更多的汽車製造商,那麼使用'in'會變得很麻煩。仍然是+1。 – 2014-12-04 15:26:44

+0

@亞歷克斯感謝您的評論。我對'in'和'where'之間的性能差異沒有太多印象。編輯。 – 2014-12-04 15:44:18

相關問題