通过比较其他变量来创建新变量

时间:2013-04-17 16:32:37

标签: sas

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

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(我的意思是很多,因为给定维度中的更多度量会增加比较次数),所以我想知道是否有更简单的方法来处理这个特定问题。

任何帮助都会被贬低。 提前谢谢。

1 个答案:

答案 0 :(得分: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;