2017-06-29 22 views
-1

假设我有这些数据读入SAS:我怎样才能提取变量和唯一值的计数SAS

Raw Data

我想列出每一个独特的名字和月数它出现在上面的数据给一个数据集是这样的:

Frequency Data

我已经调查PROC FREQ,但我想我需要做的这一个数据的步骤,因为我希望能够创建其他v新数据集内的可变数据,否则可以操纵新数据。

+0

你的最后一句话使得它无法给出很好的回答这个问题。在不知道你想要的更多数据的情况下,不可能说出最好的方法。您可以使用PROC MEANS/SQL/FREQ/TABULATE/SUMMARY/REPORT,当然还有一个数据步骤来计算数字。 – Reeza

+0

哦...我忘记了哈希表,IML,DS2 ...以及其他一些方法。 – Reeza

回答

0

虽然这是可能做到这一点在数据一步,你就是不听。你会使用proc freq或类似的。几乎每个PROC都可以给你一个输出数据集(而不是仅仅打印到屏幕上)。

PROC FREQ data=sashelp.class; 
    tables age/out=age_counts noprint; 
run; 

然后你就可以使用这个输出数据集(age_counts)为SET输入到另一个数据步执行您进一步的计算。

+0

谢谢;这原来是最简单的。我没有意识到可以从中获取数据集。 – StatsUndergrad

0

您也可以使用proc sql对变量进行分组并计算该组中的人数。这取决于你的数据有多大这可能比proc freq更快。

proc sql noprint; 
    create table counts as 
    select AGE, count(*) as AGE_CT from sashelp.class 
    group by AGE; 
quit; 
0

如果你想要做一个数据的步骤,您可以使用哈希对象保存的计数值:

data have; 
do i=1 to 100; 
    do V = 'a', 'b', 'c'; 
     output; 
    end; 
end; 
run; 

data _null_; 
set have end=last; 
if _n_ = 1 then do; 
    declare hash cnt(); 
    rc = cnt.definekey('v'); 
    rc = cnt.definedata('v','v_cnt'); 
    rc = cnt.definedone(); 
    call missing(v_cnt); 
end; 

rc = cnt.find(); 
if rc then do; 
    v_cnt = 1; 
    cnt.add(); 
end; 
else do; 
    v_cnt = v_cnt + 1; 
    cnt.replace(); 
end; 

if last then 
    rc = cnt.output(dataset: "want"); 
run; 

这是非常有效的,因为它是在数据单回路。该WANT数据集包含的关键和计数值。

0

数据步:

proc sort data=have; 
    by name month; 
    run; 

    data want; 
    set have; 
    by name month; 
    m=month(lag(month)); 
    if first.id then months=1; 
    else if month(date)^=m then months+1; 
    if last.id then output; 
    keep name months; 
run; 

临SQL:

proc sql; 
    select distinct name,count(distinct(month(month))) as months from have group by name; 
quit; 
相关问题