Neue Spalte erzeugen im Data Step ("Retain"?)
N'abend!
Folgendes problem *puh*
Ich hab Daten ähnlich dieser Form:
ID VAR RESPONSE
1 PAGE_ID p1
1 bla1 xxx
1 bla2 xxx
1 bla3 xxx
1 PAGE_ID p2
1 bla2 xxx
1 bla3 xxx
2 PAGE_ID p1
2 bla1 xxx
2 bla2 xxx
2 PAGE_ID p6
2 blaa xxx
2 PAGE_ID p7
2 bla4 xxx
2 bla6 xxx
3 PAGE_ID p2
3 bla3 xxx
3 bla4 xxx
3 PAGE_ID p4
3 bla9 xxx
4 PAGE_ID p1
4 bla2 xxx
...
so in etwa sieht das aus. ein ausschnitt meiner testdatei hab ich angehängt.
Jetzt will ich eine neue Spalte haben, in der eine laufende nummer vergeben wird von 1 bis n.
Für jede ID soll diese neu von eins beginnen. Und sobald in Spalte VAR (Question_Code in dem csv) wieder PAGE_ID steht
und gleichezeitig in RESPONSE eine neue bezeichnung erscheint als es beim vorherigen mal der fall war als PAGE_ID in der VAR Spalte stand.
Hm hoffe das ist verständlich *g*
Ich muss irgendwie den zähler so lang nicht erhöhen bis sich der RESPONSE wert ändert sobald VAR den Wert Page_ID annimmt. Und das eben für jede ID von vorne. *grübel*
Im endeffekt solls dann so aussehn.
ID VAR RESPONSE
1 PAGE_ID p1 1
1 bla1 xxx 1
1 bla2 xxx 1
1 bla3 xxx 1
1 PAGE_ID p2 2
1 bla2 xxx 2
1 bla3 xxx 2
2 PAGE_ID p1 1
2 bla1 xxx 1
2 bla2 xxx 1
2 PAGE_ID p6 2
2 blaa xxx 2
2 PAGE_ID p7 3
2 bla4 xxx 3
2 bla6 xxx 3
3 PAGE_ID p2 1
3 bla3 xxx 1
3 bla4 xxx 1
3 PAGE_ID p4 2
3 bla9 xxx 2
4 PAGE_ID p1 1
4 bla2 xxx 1
...
Hab zwar versucht innerhalb meines datesteps mit "retain" da was zu basteln, aber klappen tut da nix.
Wäre super wenn ich da nen schritt weiterkäme hier :-)
grüße!
- Anmelden oder Registrieren um Kommentare zu schreiben

damn sorry, das beispiel ist
damn sorry, das beispiel ist wohl verrutscht. lieber gleich das xls anschaun. danke
neue Spalte
Hallo Nico,
da muss man natürlich aufpassen, aber vorausgesetzt, dass bei einem ID-Wechsel immer "PAGE_ID" als erstes kommt und nicht mal was anderes sollte es so funktionieren.
data test;
input ID $ VAR $ RESPONSE $;
cards;
1 PAGE_ID p1
1 bla1 xxx
1 bla2 xxx
1 bla3 xxx
1 PAGE_ID p2
1 bla2 xxx
1 bla3 xxx
2 PAGE_ID p1
2 bla1 xxx
2 bla2 xxx
2 PAGE_ID p6
2 blaa xxx
2 PAGE_ID p7
2 bla4 xxx
2 bla6 xxx
3 PAGE_ID p2
3 bla3 xxx
3 bla4 xxx
3 PAGE_ID p4
3 bla9 xxx
4 PAGE_ID p1
4 bla2 xxx
;
run;
proc sort data=test;
by ID;
run;
data test2(drop=merke);
set test;
by ID;
retain merke;
if first.ID then do;
n=1;
end;
if VAR="PAGE_ID" then do;
merke=response;
end;
if VAR="PAGE_ID" and not first.ID and response ne lag(merke) then do;
n+1;
end;
run;
Ich habe es mit Deiner Exceldatei ausprobiert, auf den ersten Blick kam dasselbe heraus, nur dass Du vergessen hast bei der neuen ID=2 wieder von vorne anzufangen (zumindest gleich beim Gruppenwechsel).
Gruß
Wolfgang
Vielen Dank Wolfgang! Hab
Vielen Dank Wolfgang!
Hab das ganze angepasst und es funktioniert bisher so wie ich es mir vorgestellt hab.
Die "lag" Funktion kannte ich bisher nicht...
jetzt muss ich nochmal ne
jetzt muss ich nochmal ne andere frage hinterherschieben.
Ich brauche einen Befehl um eine Zeile weiterzu springen innerhalb eine SAS datesets. Hintergrund ist folgender
Code Value
aaa 123
aaa 123
x 1
y 2
aaa 123
aaa 123
aaa 123
Sobald in Zeile mit dem Code X der Value ungleich dem ist eine Zeile darunter mit dem Code Y will ich x um eins erhöhen. Gibt es da sowas wie eine NEXT befehl um das zu prüfen?
Sowas wie
if Code = x and Value ^= NEXT(Value) then Value + 1
Option POINT
probier es mal so, ist jetzt zugegebenermaßen auf das obige Beispiel zugeschnitten, zeigt aber, dass man durchaus auf den nächsten, bzw. einen beliebigen Satz zugreifen kann.
data test;
input Code $ Value;
cards;
aaa 123
aaa 123
x 1
y 2
aaa 123
aaa 123
aaa 123
;
run;
data test2(drop=value_next code_next);
set test;
if Code="x" then do;
n=_n_+1; /* _n_ ist die Observation, die sich gerade PDV
(Program Data Vector) befindet. */
set test(rename=(code=code_next value=value_next)) point=n;
/* point ist eine Option des SET-Statements, hier wird die Observation
n=_n_+1 (also der nächste Satz) eingelesen. Bei dieser Option (point)
muss man aufpassen, dass man keine Endlosschleife bastelt. Näheres in
der Online-Doc */
if value ne value_next then do;
value+1;
end;
end;
run;
Gruß
Wolfgang