2016-07-12 58 views
0

這是我今天開了SAS和我在看一些代碼,一個同事寫的第一次。SAS等同於R的is.element()

所以我們假設我有一些數據(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 I會寫類似:

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

我想一定是這樣的$也爲SAS?

+0

看PROC排序與uniqueout和Dupout選項。 – Reeza

+0

如果您需要SAS程序員的幫助,那麼您需要解釋您的R代碼的功能。你也應該解釋一下你用R代碼解決了什麼問題,而不僅僅是它如何工作。一般來說,當你使用不同的語言時,你需要調整你的方法。 – Tom

回答

2

對我來說,它看起來像將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; 

但如果你的目的是找到觀察結果每個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; set M.import; 其中,在M.import_dup1中的VTNR; run;' (我也試過沒有'M.',結果相同。) – Zap

+0

如果你能提供一個小例子數據,這將會非常有幫助。 –

+0

我正在加載一個csv.File,我無法在這裏上傳。但VTNR是最好的32。如果這有什麼區別。所以「失蹤」M.不會造成問題? – Zap

1

我會用在PROC SORT的選項。 確保指定的OUT =數據集,否則你會覆蓋原始數據。

/*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(和你的既有代碼)將是三個步驟。同樣,我也不會在這裏用這個,這是什麼東西,你可以做更容易多餘的工作,但概念是在其他情況下很有幫助。

首先,獲得重複的數據集 - 無論是她的方法,或proc sort

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

然後拉那些成宏列表:

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

然後你有他們在&duplist.並且可以使用它們像這樣:

data want; 
    set have; 
    if not (byvar in &duplist.); 
run;