来自数据集的SAS摘要统计信息

时间:2018-02-04 02:51:55

标签: sas sas-macro

数据集如下所示:

colx      coly    colz  
0         1       0      
0         1       1      
0         1       0       

必需的输出:

Colname      value    count

colx         0        3
coly         1        3
colz         0        2
colz         1        1

以下代码完美无缺......

ods output onewayfreqs=outfreq;

proc freq data=final;
  tables colx coly colz / nocum nofreq;
run;

data freq;
  retain colname column_value;
  set outfreq;
  colname = scan(tables, 2, ' ');
  column_Value = trim(left(vvaluex(colname)));
  keep colname column_value frequency percent;
run;

......但我认为效率不高。假设我有1000列,在所有1000列上运行prof freq效率不高。有没有其他有效的方法可以使用proc freq来完成我想要的输出?

3 个答案:

答案 0 :(得分:1)

计算频率计数的最有效机制之一是通过forFeature()标记为参考计数设置的哈希对象。

“哈希对象 - 维护关键摘要”的SAS文档演示了单个变量的技术。以下示例更进一步,计算数组中指定的每个变量。 suminc指定每次使用suminc:'one'都会将ref的值添加到内部参考总和中。在迭代不同的输出键时,频率计数通过one方法提取。

sum

注意* one million data values; data have; array v(1000); do row = 1 to 1000; do index = 1 to dim(v); v(index) = ceil(100*ranuni(123)); end; output; end; keep v:; format v: 4.; run; * compute frequency counts via .ref(); data freak_out(keep=name value count); length name $32 value 8; declare hash bins(ordered:'a', suminc:'one'); bins.defineKey('name', 'value'); bins.defineData('name', 'value'); bins.defineDone(); one = 1; do until (end_of_data); set have end=end_of_data; array v v1-v1000; do index = 1 to dim(v); name = vname(v(index)); value = v(index); bins.ref(); end; end; declare hiter out('bins'); do while (out.next() = 0); bins.sum(sum:count); output; end; run; 使用标准语法,变量可以是字符和数字的混合,并且具有许多通过选项指定的附加功能。

答案 1 :(得分:0)

我认为代码中最耗时的部分是生成ODS报告。您可以在应用频率之前转置数据。下面的示例在几秒钟内完成1000行1000个变量的任务。如果使用ODS进行,可能需要更长的时间。

data dummy;
    array colNames [1000] col1-col1000;
    do line = 1 to 1000;
        do j = 1 to dim(colNames);
            colNames[j] = int(rand("uniform")*100);
        end;
        output;
    end;
    drop j;
run;

proc transpose 
    data = dummy 
    out = dummyTransposed (drop = line rename = (_name_ = colName col1 = value))
    ;
    var col1-col1000;
    by line;
run;

proc freq data = dummyTransposed noprint;
    tables colName*value / out = result(drop = percent);
run;

答案 2 :(得分:0)

也许这些评论中的陈述是真正的问题。

  

我感觉像proc freq的odsoutput正在减速和创造   巨大的日志和输出。想到10,000个变量和百万条记录。   我觉得应该有另一种方法来完成这个和阵列   似乎非常合适

如果您不想要,可以告诉ODS不要生成打印输出。

ods exclude all ;
ods output onewayfreqs=outfreq;
proc freq data=final;
  tables colx coly colz / nocum nofreq;
run;
ods exclude none ;