0

以下のようなデータセットがあります

ID  A   B  C  D  E
1   1
1          1
1       1
2       1
2             1
3                1
3   1
4          1
5       1

IDごとにデータを1行にまとめたいと思います。したがって、データセットは次のようになります。

ID  A   B  C  D  E
 1  1   1  1 
 2      1     1
 3  1            1
 4         1
 5      1

別のテーブルを作成し、重複する ID を削除しました。A と B の 2 つのテーブルがあります。次に、2 つのデータセットをマージしてみました。私は次のSASコードで遊んでいました。

data C; 
     merge A B; 
     by ID;
run; 
4

3 に答える 3

2

これは、別のフォーラムから拾った巧妙なトリックです。元のデータセットを分割する必要はありません。最初の update ステートメントで構造を作成し、2 番目のステートメントで値を更新します。BY ステートメントは、ID ごとに 1 つのレコードのみを取得することを保証します。

data have;
infile datalines dsd;
input ID  A   B  C  D  E;
datalines;
1,1,,,,,
1,,,1,,,
1,,1,,,,
2,,1,,,,
2,,,,1,,
3,,,,,1,
3,1,,,,,
4,,,1,,,
5,,1,,,
;
run;

data want;
update have (obs=0) have;
by id;
run;
于 2013-10-03T09:04:14.140 に答える
0

PROC MEANS は、このような場合に最適なツールです。PROC SQL でも合理的な解決策が得られますが、MEANS の方が高速です。

proc means data=yourdata;
var a b c d e;
class id;
types id; *to avoid the 'overall' row;
output out=yourdata max=; *output the maximum of each var for each ID - use SUM instead if you want more than 1;
run;
于 2013-10-03T03:40:19.653 に答える
0

retainこれは、ステートメントを使用して解決できます。

data B(rename=(A2=A B2=B C2=C D2=D));
  set A;
  by id;
  retain A2 B2 C2 D2;
  if first.id then do;
    A2 = .;
    B2 = .;
    C2 = .;
    D2 = .;
  end;
  if A ne . then A2=A;
  if B ne . then B2=B;
  if C ne . then C2=C;
  if D ne . then D2=D;
  if last.id then output;
  drop A B C D;
run;

これを解決する方法は他にもありますが、これが役立つことを願っています。

于 2013-10-02T21:39:42.870 に答える