2011-05-20 81 views
2

我想根據範圍而不是顯式數字將人員的姓名分配給某個數字。可以使用格式來做到這一點,但是因爲我有數據集中的名稱,所以我寧願避免編寫proc format的手動過程。按數字範圍合併

data names;      
    input low high name $; 
    datalines; 
1 10 John 
11 20 Paul 
21 30 George 
31 40 Ringo 
; 

data numbers; 
    input number; 
    datalines; 
33 
21 
17 
5 
; 

所需的輸出是:

data output; 
    input number name $; 
    datalines; 
33 Ringo 
21 George 
17 Paul 
5 John 
; 

感謝您的幫助。

回答

5

你能做到這樣使用PROC SQL:

proc sql; 
create table output as 
select numbers.number, names.name 
from numbers left join names 
    on numbers.number ge names.low 
    and numbers.number le names.high 
; 
quit; 
+0

非常整齊非常感謝 – Murray 2011-05-23 01:37:34

1

我認爲SQL更加簡潔確實,但如果你是它並不大風扇和數字來已知的增量,您可以嘗試例如:

data ranges; 
    set names; 
    do number = low to high; /* by ... */ 
     output; 
    end; 
proc sort; 
    by number; 
run; 

data output; 
    merge ranges 
     numbers (in = innum) 
    ; 
    by number; 
    keep number name; 

    if innum; 
run; 

同樣,它需要數字以預定的增量出現,例如整數。

+0

大具有非SQL替代 – Murray 2011-05-23 01:36:48

3

proc format的一個有用的功能是能夠使用數據集來創建格式,而不是手動輸入格式。您的方案似乎是這個功能的完美場景。

在你給出的例子中,對「名稱」數據集的一些小改動將把它放在一個可以通過proc格式讀取的表單中。

例如,如果我修改名稱的數據集,像這樣..

data names; 
    retain fmtname "names" type "N"; 
    input start end label $; 
    datalines; 
1 10 John 
11 20 Paul 
21 30 George 
31 40 Ringo 
; 

然後我就可以發出此命令建立一個基於它的格式。

proc format cntlin=names;run; 

現在我可以像使用任何其他格式一樣使用此格式。例如,創建一個包含基於號碼進行必要的「名」新列,你可以這樣做:

data numbers; 
    input number; 
    number_formatted=put(number,names.); 
    datalines; 
33 
21 
17 
5 
; 

這裏是輸出會是什麼樣子:

   number_ 
    number formatted 

    33  Ringo 
    21  George 
    17  Paul 
    5  John 

更新地址問題:

從文本文件中讀取所需的編碼沒有太大的區別。我們只需要設置它,以便輸出數據集具有proc格式所需的特定變量名稱(fmtname,type,start,end和label)。

例如,如果我有一個名爲「names」的外部逗號分隔文件。CSV」,看起來像這樣:

1,10,John 
11,20,Paul 
21,30,George 
31,40,Ringo 

然後,我只是可以更改創建的代碼‘設置名稱’數據,以便它看起來像這樣:

data names; 
    retain fmtname "names" type "N"; 
    infile "<path to file>/names.csv" dsd; 
    input start end label $; 
run; 

現在我可以運行PROC格式像我的cntlin選項以前那樣:。。。。

proc format cntlin=names;run; 
+0

輝煌我懷疑會有一種方式來使用數據集作爲格式O操作。然而,我有一個外部csv中的格式數據集,我可以很好地讀取SAS數據集,但是我無法使用'datalines'方法創建數據集中的格式。您能否建議使用現有SAS數據集創建格式的代碼? – Murray 2011-05-24 05:44:16

+0

太棒了,就是這個問題。只需要正確的變量名稱'start,end,&label'。再次感謝。 – Murray 2011-05-25 00:37:20