2016-07-12 9 views
0

今日私はsasを開いたのは初めてで、同僚が書いたコードを見ています。Rはis.element()に相当するSAS

私はいくつかのデータ(import)が重複しているとしましょうが、私はVTNRという名前のユニークな番号を持つものだけを必要としているとしましょう。

まず彼女は、固有の番号を探します。

data M.import; 
    set M.import; 

    by VTNR; 
    if first.VTNR=1 then unique=1; 
    run; 

それから彼女は、重複番号を持つテーブルを作成します。すべての重複と

data M.import_dup1; 
    set M.import; 

    where unique^=1; 
    run; 

そして最後にテーブル。 しかし、ここでは、彼女は本当に例えばので、番号をハードコーディングされています

data M.import_dup2; 
    set M.import; 
    where VTNR in (130001292951,130100975613,130107546425,130108026864,130131307133,130134696722,130136267001,130137413257,130137839451,130138291041); 
    run; 

私はより良い方法がなければならないと確信しています。

私は私のようなもの書くとRとの唯一のよく知っているので:私は推測

import_dup2 <- subset(import, is.element(import$VTNR, import_dup1$VTNR)) 

をSASにも$のようなものがなければなりませんか?

+0

ルックを

proc sort nodupkey data=have out=nodups dupout=dups; by byvar; run; 

そして、マクロリストにそれらを引きますオプション。 – Reeza

+0

SASプログラマーの助けが必要な場合は、Rコードの内容を説明する必要があります。また、Rコードを使ってどのような問題を解決しようとしているのかを説明するだけでなく、それがどのように機能するかを説明する必要があります。一般に、異なる言語を使用する場合は、問題へのアプローチを適応させる必要があります。 – Tom

答えて

2

VTNR値ごとに複数の観測値を持つIMPORTでは、最初に他のテーブルを作成する必要はありません。

data import_dup2 ; 
    set import; 
    by VTNR ; 
    if not (first.VTNR and last.VTNR); 
run; 
+0

'by'を使うには、その変数でデータセットをソートする必要があることに注意してください。 – Joe

0

上記のソリューションでは重複はありますが、固有の値は得られません。 SASで両方を実行する方法はたくさんあります。非常に理解しやすいSQLソリューションです。

proc sql; 
create table no_duplicates as 
    select * 
     from import 
     group by VTNR 
     having count(*) = 1 
    ; 
create table all_duplicates as 
    select * 
     from import 
     group by VTNR 
     having count(*) > 1 
    ; 
quit; 
+0

私はあなたのアプローチを理解することができますが、実際には 'is.element()' -way(と '$')のようなものを探しています。またはこれはsasに存在しませんか? – Zap

+0

SAS Baseはマトリックス言語ではありません。 SAS/IMLにアクセスできる場合は、ベクター比較を行うことができます。しかし、IMLでは、Rコードを使用することもできます。 – Jetzler

-2
data want; 
    set import; 
    where VTNR in import_dup1; 
run; 
+0

これはまさに私が達成したいのと同じように見えますが、次のコードを入力するとゼロラインが生成されます。 'データM.want; セットM.import; ここで、VTNR in M.import_dup1; run; ' (同じ結果で' M'を付けずに試してみました) – Zap

+0

小さなサンプルデータを提供できるなら、非常に役に立ちます。 –

+0

私はここにアップロードできないcsv.Fileをロードしています。しかし、VTNRはベスト32です。これによって差があればだから "欠けている" 'M.'は問題を引き起こしていないのですか? – Zap

1

私はPROCのSORTのオプションを使用します。 OUT =データセットを指定しないと、元のデータを上書きしません。 Rコードの最も直接的な翻訳

import_dup2 <- subset(import, is.element(import$VTNR, import_dup1$VTNR)) 

は、SQLコード

proc sql; 
create table import_dup2 as 
    select * from import 
    where VTNR in (select VTNR from import_dup1) 
; 
quit; 

を用いることであろうようにしかし、あなたの目的がで観測を見つけることであれば、それは見えます私に

/*Generate fake data with dups*/ 
data class; 
set sashelp.class sashelp.class(obs=5); 
run; 

/*Create unique and dup dataset*/ 
proc sort data=class nouniquekey uniqueout=uniquerecs out=dups; 
by name; 
run; 

/*Display results - for demo*/ 
proc print data=uniquerecs; 
title 'Unique Records'; 
run; 

proc print data=dups; 
title 'Duplicate Records'; 
run; 
0

私はReezaのかトムのソリューションを使用することになりますが、完全を期すために、ソリューションR(とあなたの既存のコード)に似最もは、次の3つの手順になります。繰り返しますが、私はここでこれを使用しません。より簡単にできることのための余分な作業ですが、このコンセプトは他の状況で役立ちます。

最初に、重複のデータセットを取得します(彼女の方法、またはproc sort)。

proc sql; 
    select byvar 
    into :duplist separated by ',' 
    from dups; 
quit; 

は、その後、あなたが&duplist.でそれらを持っているので、同じようにそれらを使用することができます:uniqueoutとDupoutとのprocソートで

data want; 
    set have; 
    if not (byvar in &duplist.); 
run; 
関連する問題