Ein SAS-Datastep ist hier die beste Option. Richten Sie ein Array ein, um jeden Wert nacheinander zu lesen, einschließlich über mehrere Zeilen, speichert sie in einem neuen Array und gibt sie erst nach dem Lesen der letzten ID aus.
Das einzige Problem ist, dass Sie die maximale Anzahl der Werte wissen müssen, die eine ID nehmen kann, die nrows x ncols (nicht nur die Anzahl der Zeilen) sein wird. In Ihrem Beispiel ist der Anser 9, da ID A 3 Zeilen und 3 Spalten hat. Eine Lösung besteht darin, die Anzahl der Elemente im neuen Array so festzulegen, dass sie höher ist, als Sie für erforderlich halten. Es bedeutet lediglich, dass am Ende des Datasets einige leere Spalten vorhanden sind. Ich habe den Wert auf 10 in meinem Code unten festgelegt.
data have;
input ID $ A1 A2 A3;
datalines;
A 1.2 1.5 1
A 1.3 1.7 1.3
A 1.4 1.8 1.7
B 1.5 1.8 1.9
B 1.6 1.7 1.0
;
run;
data want;
set have;
by id;
retain newA1-newA10; /* keep values across rows */
array oldvars{*} A: ; /* array of existing variables */
array newvars{*} newA1-newA10; /* array of new variables */
if first.id then do; /* reset counter and array values when ID changes */
counter=0;
call missing(of newA1-newA10);
end;
do i = 1 to dim(oldvars); /* loop through each value and store in new array */
counter+1;
newvars{counter} = oldvars{i};
end;
if last.id then output; /* only output after last ID is read */
drop A: counter i; /* drop unwanted variables */
run;
Wissen Sie im Voraus, wie hoch die maximale Anzahl von Zeilen pro ID ist? Dies ist auch sehr schwierig, wenn Sie SQL verwenden, es sei denn, Sie haben auch eine andere Variable in Ihrem Dataset, die für jede ID von 1 in der ersten Zeile beginnt und für jede fortlaufende Zeile mit derselben ID um 1 erhöht. – user667489