Sas 将数据集中的行转换为变量

Sas 将数据集中的行转换为变量,sas,Sas,我有如下数据集:- data club; input Name $ Gov_Type $ YR1 YR2 YR3; datalines; Afg COC 10 20 30 Afg GE 20 30 40 Afg PS 10 3 202 Afg RQ . 30 10 Brh COC 10 . 30 Brh GE 4 12 33 Brh PS 12 43 12 Brh RQ 19 3 12 Gen COC 32 . 65 Gen GE 13 93 44 Gen PS 12 38 12 Gen RQ

我有如下数据集:-

data club;
input Name $ Gov_Type $ YR1 YR2 YR3;
datalines;
Afg COC 10 20 30
Afg GE 20 30 40
Afg PS 10 3 202
Afg RQ . 30 10
Brh COC 10 . 30
Brh GE 4 12 33
Brh PS 12 43 12
Brh RQ 19 3 12
Gen COC 32 . 65
Gen GE 13 93 44
Gen PS 12 38 12
Gen RQ 13 1 13
;
我想更改它,使
COC
GE
PS
RQ
成为变量,并将
YR1
YR2
YR3
的值显示为以下数据集:-

data club2;
input Name $ YR $ COC GE PS RQ;
datalines;
Afg YR1 10 20 10 . 
Afg YR2 20 30 3  30
Afg YR3 30 40 202 10
Brh YR1 10 4 12 9
Brh YR2 . 12 43 3
Brh YR3 30 33 12 12
Gen YR1 32 13 12 13
Gen YR2 . 93 38 1
Gen YR3 65 44 12 13
;
我怎样才能做到这一点

提前谢谢。

试试这个

data club;
input Name $ Gov_Type $ YR1 YR2 YR3;
datalines;
Afg COC 10 20 30
Afg GE 20 30 40
Afg PS 10 3 202
Afg RQ . 30 10
Brh COC 10 . 30
Brh GE 4 12 33
Brh PS 12 43 12
Brh RQ 19 3 12
Gen COC 32 . 65
Gen GE 13 93 44
Gen PS 12 38 12
Gen RQ 13 1 13
;

data temp;
   set club;
   array y yr:;
   do over y;
      yr = y;
      v = vname(y);
      output;
   end;
   drop yr1-yr3;
run;

proc sort data = temp;
   by Name v Gov_Type;
run;

data club2;
   do i = 1 by 1 until (last.v);
      set temp;
      by Name v;
      array g{*} coc ge ps rq;
      if upcase(Gov_Type) = upcase(vname(g[i])) then g[i] = yr;
   end;
   drop i yr Gov_Type;
run;

所需的数据转换很容易通过
Proc TRANSPOSE
完成

proc transpose data=club out=stage(rename=_name_=YR);
  by name;
  id Gov_type;
run;

如果转换用于报告目的,考虑使用
Proc tablate

proc tabulate data=club;
  class name gov_type;
  var yr1-yr3;
  table name=''*(yr1-yr3)*sum=' '*f=9.,gov_type;
run;