2016-07-12 19 views
0

Es ist das erste Mal, dass ich sas heute geöffnet habe und ich sehe mir einen Code an, den ein Kollege geschrieben hat.SAS entspricht R's is.element()

Also sagen wir, ich habe einige Daten (import), wo Duplikate auftreten, aber ich möchte nur diejenigen, die eine eindeutige Nummer namens VTNR haben.

Zuerst sieht sie für eindeutige Zahlen:

data M.import; 
    set M.import; 

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

Dann schafft sie eine Tabelle mit den duplizierten Nummern:

data M.import_dup1; 
    set M.import; 

    where unique^=1; 
    run; 

Und schließlich eine Tabelle mit allen Duplikate. Aber hier sie wirklich ist hartzucodieren die Zahlen, so zum Beispiel:

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

Ich bin sicher, es muss ein besserer Weg geben.

Da ich nur vertraut mit R bin ich so etwas wie schreiben würde:

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

Ich denke, es muss so etwas wie die $ auch für sas sein?

+0

Blick auf proc Art mit dem uniqueout und Dupout Optionen. – Reeza

+0

Wenn Sie Hilfe von SAS-Programmierern benötigen, müssen Sie erklären, was Ihr R-Code tut. Außerdem sollten Sie erklären, welches Problem Sie mit dem R-Code lösen möchten und nicht nur, wie es funktioniert. Im Allgemeinen müssen Sie Ihre Herangehensweise an Probleme anpassen, wenn Sie verschiedene Sprachen verwenden. – Tom

Antwort

2

Für mich ist es wie die meisten direkte Übersetzung des R-Code

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

Aber wenn Ihre Absicht ist, zu finden, die Beobachtungen in aussieht

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

Wäre die Verwendung von SQL-Code IMPORT, die mehr als eine Beobachtung pro VTNR-Wert haben, müssen Sie zunächst keine andere Tabelle erstellen.

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

Beachten Sie, dass 'by' das Dataset nach dieser Variablen sortiert sein muss. – Joe

0

Die obige Lösung kann Duplikate liefern, aber keine eindeutigen Werte. Es gibt viele Möglichkeiten, beides in SAS zu tun. Sehr einfach zu verstehen wäre eine SQL-Lösung.

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

Ich kann Ihre Herangehensweise verstehen, aber ich suche wirklich nach etwas wie dem 'i.element() '- Weg (und dem' $ '), da ich es für alle Arten von Untergruppen sehr nützlich finde. Oder gibt es das nicht in sas? – Zap

+0

SAS Base ist keine Matrixsprache. Wenn Sie Zugriff auf SAS/IML haben, können Sie Vektorvergleiche durchführen. Aber in IML können Sie auch einfach R-Code verwenden. – Jetzler

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

Das sieht genau so aus, was ich erreichen möchte, aber wenn ich den folgenden Code eintippe, werden Nulllinien erzeugt. 'Daten M.want; Satz M.import; wo VTNR in M.import_dup1; run; ' (Ich habe auch ohne' M.' mit dem gleichen Ergebnis versucht.) – Zap

+0

Es wird sehr hilfreich sein, wenn Sie ein kleines Beispiel Daten bereitstellen könnten. –

+0

Ich lade eine csv.File, die ich hier nicht hochladen kann. Aber VTNR ist ein Best32. wenn das einen Unterschied macht. Also verursacht das "fehlende" 'M 'nicht das Problem? – Zap

1

würde ich die Optionen in PROC SORT verwenden. Stellen Sie sicher, dass Sie ein OUT = -Dataset angeben, sonst überschreiben Sie Ihre ursprünglichen Daten.

/*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

würde ich Reeza oder die Tom-Lösung verwenden, aber für die Vollständigkeit, die Lösung meist ähnlich wie R (und Ihren bereits existierenden Code) würde drei Schritte sein. Noch einmal, ich würde das hier nicht verwenden, es ist überflüssige Arbeit für etwas, was Sie leichter tun können, aber das Konzept ist hilfreich in anderen Situationen.

Zuerst erhalten Sie den Datensatz von Duplikaten - entweder ihre Methode oder proc sort.

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

Dann werden die, in eine Makroliste ziehen:

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

Dann haben Sie sie in &duplist. und können sie verwenden, etwa so:

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