2017-09-02 36 views
-1

我有一个864行以下的数据集。我想创建一个单独的列“Group”,使用不同的128种屏幕组合,包括SCREEN,BATTERY,RAM,PROCESSOR,HD_SIZE,BUNDLED_APP,Int_Wire。如何在sas中用不同的组合行创建列?

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 
+0

组1和组120的逻辑是什么?将来请解释逻辑,不要指望我们弄明白。如果它回答您的问题,请参阅本教程:https://stats.idre.ucla.edu/sas/faq/how-can-i-create-an-enumeration-variable-by-groups/ – Reeza

+0

大约有864行在目前的数据集中,我有128个独特的行组合。我用excel获得了它。据此,我想在当前数据集中分配128个组名。 –

+0

我应用了此链接中给出的逻辑,但是我找不到所需的组号 –

回答

1

这其实是一个整洁的问题。我假设你的变量可以采取的值是低和高,或者是和不是。我从你有7个变量和2^7 = 128.

得到你正在寻找的组变换你的表,所以低和没有值是0的所有是和高值是1的。你现在有一个七位二进制数字。将该二进制数字转换回十进制数字,您将得到一个从0到127的数字。

+0

谢谢,请给我一个代码 –

+0

好吗,你有什么尝试? SO不是免费的编码服务。高兴地帮助你,但给它一个去看看你能想出什么。将您的工作提供为可轻松复制和粘贴的内容,以便其他人可以处理您的工作。 – DCR

0

如果您将值编码为0/1而不是文本字符串,并且您没有缺少值,则很容易将N个二进制变量转换为从0到(2 ** N -1)的单个数字。

group=input(cats(of var1-var7),binary7.) ; 

您可以添加一个让数字去从1到128,而不是从0到127

如果你只是想找到所有现有的组合,那么你可以使用像soemthing PROC摘要找到组合,然后添加一个计数器。或者分类并使用FIRST。处理添加计数器。

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; 

但是,如果某个值,说SCREEN =“大”,不会出现在数据,那么就不会出现在组。