2017-09-02 84 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 =「大」,不會出現在數據,那麼就不會出現在組。