0

我有一个数据集,其中包含由不同的人/仪器做出的一系列不同维度的读数。它看起来像这样:

SUBJECT DIM1_1 DIM1_2 DIM1_3 DIM1_4 DIM1_5 DIM2_1 DIM2_2 DIM2_3 DIM3_1 DIM3_2
1       1      .      1      1      2      3      3      3      2      .
2       1      1      .      1      1      2      2      3      1      1
3       2      2      2      .      .      1      .      .      5      5
...     ...    ...    ...    ...    ...    ...    ...    ...    ...    ...

我的真实数据集包含大约 190 个维度,每个维度最多包含 5 个度量

我必须遵守一组规则来为每个维度创建一个新变量:

  • 如果同一维度中有 2 个不同的值(不包括缺失值),则新变量为缺失值。
  • 如果所有值都相同(排除缺失值),则新变量采用相同的值。

我的新变量应如下所示:

SUBJECT  ...  DIM1_X DIM2_X DIM3_X
1        ...  .      3      2
2        ...  1      .      1
3        ...  2      1      5

这里的问题是我对每个维度没有相同数量的度量。另外,我只能想出很多 IF(我的意思是很多,因为给定维度中的更多度量会增加比较次数),所以我想知道是否有一些更简单的方法来处理这个特定问题。

任何帮助将不胜感激。提前致谢。

4

1 回答 1

2

最简单的方法是将其转置为垂直(每个 DIMx_y 一行),汇总,然后将您想要丢失的那些设置为丢失,然后重新转置(如果需要重新合并)。

data have;
input SUBJECT DIM1_1 DIM1_2 DIM1_3 DIM1_4 DIM1_5 DIM2_1 DIM2_2 DIM2_3 DIM3_1 DIM3_2;
datalines;
1       1      .      1      1      2      3      3      3      2      .
2       1      1      .      1      1      2      2      3      1      1
3       2      2      2      .      .      1      .      .      5      5
;;;;
run;

data have_pret;
set have;
array dim_data DIM:;
do _t = 1 to dim(dim_Data); *dim function is not related to the name - it gives # of vars in array;
 dim_Group = scan(vname(dim_data[_t]),1,'_');
 dim_num =  input(scan(vname(dim_data[_t]),2,'_'),BEST12.);
 dim_val=dim_data[_t];
 output;
end;
keep dim_group dim_num subject dim_val;
run; 

proc freq data=have_pret noprint;
by subject dim_group;
tables dim_val/out=want_pret(where=(not missing(dim_val)));
run;

data want_pret2;
set want_pret;
by subject dim_Group;
if percent ne 100 then dim_val=.;
idval = cats(dim_Group,'_X');
if last.dim_Group;
run;

proc transpose data=want_pret2 out=want;
by subject;
id idval;
var dim_val;
run;
于 2013-04-17T17:35:15.917 回答