SAS PROC转置数据

SAS PROC转置数据,sas,Sas,在SAS中,我有一个类似于下面的数据集 ID TRACT meanFA sdFA medianFA 1 t01 0.56 0.14 0.56 1 t02 0.53 0.07 0.52 1 t03 0.71 0.08 0.71 2 t01 0.72 0.09 0.72 2 t02 0.83 0.10

在SAS中,我有一个类似于下面的数据集

ID   TRACT    meanFA    sdFA      medianFA
1    t01      0.56      0.14      0.56
1    t02      0.53      0.07      0.52
1    t03      0.71      0.08      0.71
2    t01      0.72      0.09      0.72
2    t02      0.83      0.10      0.86
2    t03      0.59      0.10      0.62
ID   t01_meanFA  t01_sdFA  t01_medianFA  t02_meanFA  t02_sdFA  t02_medianFA  t03_meanFA  t03_sdFA  t03_medianFA
1    0.56        0.14      0.56          0.53        0.07      0.52          0.71        0.08      0.71
2    0.72        0.09      0.72          0.83        0.10      0.86          0.59        0.10      0.62


proc transpose data=TRACT out=newTRACT;
   var meanFA sdFA medianFA;
   by id;
   id tract meanFA sdFA medianFA;
run;
我不确定转置是否是正确的概念。。。但我希望数据看起来像下面的数据

ID   TRACT    meanFA    sdFA      medianFA
1    t01      0.56      0.14      0.56
1    t02      0.53      0.07      0.52
1    t03      0.71      0.08      0.71
2    t01      0.72      0.09      0.72
2    t02      0.83      0.10      0.86
2    t03      0.59      0.10      0.62
ID   t01_meanFA  t01_sdFA  t01_medianFA  t02_meanFA  t02_sdFA  t02_medianFA  t03_meanFA  t03_sdFA  t03_medianFA
1    0.56        0.14      0.56          0.53        0.07      0.52          0.71        0.08      0.71
2    0.72        0.09      0.72          0.83        0.10      0.86          0.59        0.10      0.62


proc transpose data=TRACT out=newTRACT;
   var meanFA sdFA medianFA;
   by id;
   id tract meanFA sdFA medianFA;
run;

我一直在玩上面的SAS代码,但没有成功。任何想法或建议都会很好

双转置就是这样实现的。将其放入一个数据集,该数据集每个ID每个所需变量有一行,因此

ID=1 variable=t01_meanFA value=0.56
ID=1 variable=t01_sdFA value=0.14
...
ID=2 variable=t01_meanFA value=0.72
...

然后使用ID=variable和var=value(或您选择命名这些列的任何名称)进行转置。通过创建一个值数组(
array vars[3]meanFA sdFA medianFA;
),然后在该数组上迭代,将变量名设置为
catx('''u',tract,vname(vars[n])),创建中间数据集
vname
获取数组元素的变量名)。

您需要两个转置。转置,使用数据步骤更新然后
\u NAME\u
变量,然后再次转置

proc transpose data=tract out=tract2;
by id tract;
run;

data tract2;
format _name_ $32.;
set tract2;
_name_ = strip(tract) || "_" || strip(_name_);
run;

proc transpose data=tract2 out=tract3(drop=_name_);
by id;
/*With no ID statement, the _NAME_ variable is used*/
var col1;
run;
使用本文中的示例数据

您也可以通过数据步骤来实现这一点

首先,将最大序列号放入宏变量中

proc sql;
select
  max(sequence_no) into : maxseq
from
  have
;
quit;
为新变量创建数组,使用宏变量设置维度。然后循环每次访问,将事件和注释放入各自的变量中。每次访问输出1行

data want(drop=sequence_no--notes);
  do until (last.visit_no);
    set have;
    by id visit_no;
    array event_ (&maxseq);
    array notes_ (&maxseq) $;
    event_(sequence_no)=event_code;
    notes_(sequence_no)=notes;
  end;
  output;
run;

这很有效。我的数据是按照正确的顺序设置的。唯一的问题是变量名仍然像“meanFA”、“sdFA”和“medianFA”。实际上,我在看标签!谢谢您可以通过更改
\u label\u
列中的值来更改标签,或者创建一个新列来保存新标签,并在第二次转置中使用
idlabel
语句。