2016-09-12 3 views
0

を置き換えるために保持します。SASの問題は、次の継承された簡略化されたコードは、グループ内のエントリを欠落していない値を持つ列の欠損値を置き換えることを意図している欠落したデータ

DATA WORK.TOYDATA; 
    INPUT Category $ PRICE; 
    DATALINES; 
Cat1 2 
Cat1 . 
Cat1 . 
Cat2 . 
Cat2 3 
Cat2 . 
; 

DATA WORK.OUTTOYDATA; 
SET WORK.TOYDATA; 
    BY Category ; 
    RETAIN _PRICE; 
    IF FIRST.Category THEN _PRICE=PRICE; 
    IF NOT MISSING(PRICE) THEN _PRICE=PRICE; 
ELSE PRICE=_PRICE; 
DROP _PRICE; 
RUN; 

残念ながら、これがあれば動作しません。グループ内の最初のエントリが見つかりません。どのようにこれを修正することができますか?

+1

カテゴリは、複数の異なる価格に関連付けることができますか? – Vincent

+0

@Vincent - 私はできると思いますが、これは私が見る別の問題です... – cs0815

+0

もしそうなら、あなたはどの値を代用に使用するかを決めるルールが必要です(例えば、最大値/最小値、ランダムな既存の値など) – Vincent

答えて

2

SASはデータセットを通じて行ごとに動作するため、最初の値がない場合は置き換える値はありません。 これを回避するために、カテゴリと価格DESCENDINGでデータを並べ替えることができます。

proc sort data= WORK.TOYDATA; by Category DESCENDING PRICE; run; 

カテゴリでNON欠損値が1つしかない場合は、SQL結合を使用できます。

proc sql; 
create table WORK.OUTTOYDATA as 
    select a.Category, coalesce(a.PRICE, b.PRICE) as PRICE 
     from WORK.TOYDATA a 
      left join (select distinct Category, PRICE 
          from WORK.TOYDATA 
           where PRICE ne . 
           ) b 
      on a.Category eq b.Category 
     ; 
quit; 
1

@Jetzlerが指摘するように、最も簡単な方法はデータを並べ替えることです。しかし、欠損値を持つ列が複数ある場合は、複数の並べ替えを行う必要があり、効率的ではありません。

結合を行う別のオプションは、欠損値を単純な数値(平均、中央値、合計など)で置き換えるために使用できるproc stdizeです。あなたの例ではデフォルトの方法で十分ですが、唯一欠損値を置き換え、データを標準化しないreponlyオプションを追加する必要があります。

DATA WORK.TOYDATA; 
    INPUT Category $ PRICE; 
    DATALINES; 
Cat1 2 
Cat1 . 
Cat1 . 
Cat2 . 
Cat2 3 
Cat2 . 
; 
run; 

proc stdize data=TOYDATA out=want reponly; 
by category; 
var price; 
run; 
関連する問題