2017-08-04 152 views
1

這可能是一個愚蠢的問題,但我很難處理這個問題。 我有數據類似按組分組的sas子集數據

animal firstcharacter 
mouse m 
dog d 
cat c 
monkey m 
donkey d 

我想分這「原始」數據轉換爲基於firstcharacter幾個數據集。

在這個例子中,我應該有3組(c,d,m)。

這是容易的,如果我這樣做,一個接一個:

data new_c; set original; if firstcharacter = "c" then; run; 
data new_d; set original; if firstcharacter = "d" then; run; 
data new_m; set original; if firstcharacter = "m" then; run; 

的問題是,我在實際數據數百個這樣的團體。 有沒有一個簡單的方法(使用循環或宏變量)來做到這一點?

謝謝。

+0

還有其他大致類似的問題;我不會因爲沒有人真的有理想的答案而關閉重複。搜索「拆分SAS數據集」查看幾個,例如[this one](https://stackoverflow.com/questions/14955465/split-sas-dataset)。 – Joe

回答

0

這對散列表很容易做到。這是'簡單'版本,需要進行排序,但不需要散列或任何實際管理。

data have; 
input animal $ firstcharacter $; 
datalines; 
mouse m 
dog d 
cat c 
monkey m 
donkey d 
;;;; 
run; 

proc sort data=have; 
    by firstcharacter; 
run; 

data _null_; 
    set have; 
    by firstcharacter; 
    if _n_=1 then do; 
    declare hash h; 
    end; 

    if first.firstcharacter then do; 
    h = _new_ hash(); 
    h.defineKey('animal'); 
    h.defineData('animal','firstcharacter'); 
    h.defineDone(); 
    end; 

    rc = h.add(); 

    if last.firstcharacter then do; 
    rc = h.output(dataset:cats('new_',firstcharacter)); 
    end; 
run; 

更復雜的方法存在使用哈希散列(搜索,如果你想知道更多)。

+0

非常感謝!我不知道'哈希'的東西,但你的邏輯是有道理的! –

+0

當然你可以閱讀它。您也可以閱讀我發佈的鏈接以查看其他方式(宏)。這是最有效率的。 – Joe