2017-08-04 111 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