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

来自数据集的SAS摘要统计信息,sas,sas-macro,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 下面的代

数据集如下所示:

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,还有其他有效的方法来实现我想要的输出吗?

我认为代码中最耗时的部分是生成ODS报告。您可以在应用freq之前转置数据。下面的示例在几秒钟内完成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;

计算频率计数的最有效机制之一是通过一个hash对象,该对象通过suminc标记设置为引用计数

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


注:Proc FREQ使用标准语法,变量可以是字符和数字的混合体,并且有许多通过选项指定的附加功能。

也许注释中的这句话才是真正的问题

我觉得带有proc freq的odsoutput正在减速并创建 巨大的日志和输出。想想一万个变量和一百万条记录。 我觉得应该有另一种方法来实现这一点 看起来很合适

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

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

我想这是最好的了。您可以使用_all_uu关键字,而不是键入所有列名。表(全部)/nocum nofreq ;;这在什么意义上是无效的?您只运行了一次proc freq。也许可以编写一个使用更少内存的等效数据步骤,但除非证明这是您的一个限制因素,否则我就不麻烦了。我觉得带有proc freq的odsoutput正在减速,并创建大量日志和输出。想想一万个变量和一百万条记录。我觉得应该有另一种方法来实现这一点,阵列似乎非常适合
ods exclude all ;
ods output onewayfreqs=outfreq;
proc freq data=final;
  tables colx coly colz / nocum nofreq;
run;
ods exclude none ;