我有一个带有864行的数据集。我想创建一个单独的列"组",具有不同的128个屏幕,电池,RAM,处理器,HD_SIZE,BUNDLED_APP,INT_WIRE的组合。
SCREEN BATTERY RAM PROCESSOR HD_SIZE Bundled_App Int_Wire
------- ------- ---- --------- ------- ----------- --------
SMALL LOW LOW LOW LOW Yes Yes
SMALL LOW LOW LOW LOW No Yes
SMALL LOW LOW LOW LOW Yes Yes
SMALL LOW LOW LOW LOW No Yes
SMALL LOW LOW LOW LOW Yes Yes
SMALL LOW LOW LOW LOW No Yes
SMALL LOW LOW LOW HIGH Yes Yes
SMALL LOW LOW LOW HIGH No Yes
SMALL LOW LOW LOW LOW Yes No
SMALL LOW LOW LOW LOW No No
解决方案数据应如下所示:
SCREEN BATTERY RAM PROCESSOR HD_SIZE Bundled_App Int_Wire Group
------- ------- ---- --------- ------- ----------- -------- ------
SMALL LOW LOW LOW LOW Yes Yes Group 1
SMALL LOW LOW LOW LOW No Yes Group 120
SMALL LOW LOW LOW LOW Yes Yes Group 1
SMALL LOW LOW LOW LOW No Yes Group 120
SMALL LOW LOW LOW LOW Yes Yes Group 1
SMALL LOW LOW LOW HIGH Yes Yes Group 2
这实际上是一个整洁的问题。我认为您的变量可以采用的值是低和高或是,否。我从您有7个变量和2^7 = 128。
中得到的要获取您正在寻找的转换表的组,以便所有低值和所有值是0,所有的是,高值是1。您现在有一个七位数的二进制号码。将该二进制号转换回小数等效物,您将获得一个从0到127的数字。
如果将值编码为0/1而不是文本字符串,则没有丢失的值,则很容易将n个二进制变量转换为单个数字从0到(2 **)n -1)。
group=input(cats(of var1-var7),binary7.) ;
您可以添加一个以使数字从1到128,而不是从0到127。
如果您只想找到所有现有的组合,则可以使用诸如Proc摘要之类的soemantion来查找组合,然后添加计数器。或排序并首先使用。处理以添加计数器。
proc sort data=have ;
by SCREEN BATTERY RAM PROCESSOR HD_SIZE Bundled_App Int_Wire ;
run;
data groups;
set have;
by SCREEN BATTERY RAM PROCESSOR HD_SIZE Bundled_App Int_Wire ;
group + first.Int_Wire;
run;
,但这只能处理您数据中实际出现的组合。如果重复其他数据集的过程,则可以将相同组合分配给其他组号。
如果您知道每个变量的可能值,则可以生成所有可能组合的数据集。然后合并两个数据集或生成格式并使用它。
data groups;
if 0 then set have (keep=SCREEN BATTERY RAM PROCESSOR HD_SIZE Bundled_App Int_Wire);
do SCREEN='SMALL','LARGE';
do BATTERY='LOW','HIGH';
do RAM='LOW','HIGH';
do PROCESSOR='LOW','HIGH';
do HD_SIZE='LOW','HIGH';
do Bundled_App='No','Yes';
do Int_Wire='No','Yes';
group +1 ;
output;
end;
end;
end;
end;
end;
end;
end;
run;
对于这些极端之间的事物,您可以要求Proc Freq生成数据中值的所有可能组合。
proc freq data=have ;
tables SCREEN*BATTERY*RAM*PROCESSOR*HD_SIZE*Bundled_App*Int_Wire
/ sparse noprint out=groups
;
run;
data groups;
set groups ;
group + 1;
run;
但是,如果某些值,例如屏幕='大型',从不出现在数据中,则不会出现在组中。