数据集如下所示:
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来完成我想要的输出?
答案 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 ;