簡體   English   中英

SAS:如果一列具有數組中的值

[英]SAS: If a column has values that are in a array

下面是我正在做的一個例子。 我想獲取數據集的子集。(即在“字母”列中具有這些字母的行)。 我只想選擇那些Transport_company為現代,豐田或福特的記錄。

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

怎么了? 我怎樣才能使它工作。

好的,因此示例數據為:

  • 郵遞運輸_公司編號已出售
  • 12345現代10
  • 90145美國宇航局50
  • 20202豐田30
  • 40002哈雷戴維森5
  • 10000福特15

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

我認為您不需要在這里使用數組。 如果只想基於多個值選擇行,請使用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 ()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;

羅比是對的,如果您的數據還不在數組中,則不應使用數組方法,因為這會增加額外的復雜性-很好。

但是,如果它已經在數組中, 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語句要快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM