我不是一位经验丰富的SAS用户,但不幸的是,我可以访问数据的实验室仅限于SAS。此外,我目前无法访问数据,因为它仅在实验室中可用,因此我创建了用于测试的模拟数据。
我需要创建一个从PROC MEANS
表中获取值和维度的宏,并执行一些测试,检查数据中前两个值是否占结果的90%。
例如,假设我有面板数据列出公司的收入,成本和利润。我创建了一个列出n,sum,mean,median和std的表。现在我需要检查排名前两位的公司是否构成了90%的结果,如果是,则标记它的利润,收入或成本是否占90%。
我不确定如何开始
以下是步骤:
阅读数据
阅读创建的PROC MEAN
表格,获取尺寸和变量。
在每个变量中获得前两名公司并执行检查
创建新表,列出变量,读取表中的值,最大和第二大值以及标记。
然后打印表
https://www.dropbox.com/s/ypmri8s6i8irn8a/dataset.csv?dl=0
PROC意味着表
proc import datafile="/folders/myfolders/dataset.csv"
out=dt
dbms=csv
replace;
getnames=yes;
run;
TITLE "Macro Project Sample";
PROC MEANS n sum mean median std;
VAR V1 V2 V3;
RUN;
Value Largest Sec. Largest Flag
V1 463138.09 9888.09 9847.13
V2 148.92 1.99 1.99
V3 11503375 9999900 1000000 Y
答案 0 :(得分:3)
目前我无法打开您的模拟数据集,但我可以给您一些建议,希望他们能提供帮助。
您可以使用带有选项IDGROUP的'output out ='语句添加给定变量的n个极值。
这是一个使用慈善数据集的例子(运行它来创建它http://support.sas.com/documentation/cdl/en/proc/65145/HTML/default/viewer.htm#p1oii7oi6k9gfxn19hxiiszb70ms.htm)
proc means data=Charity;
var MoneyRaised HoursVolunteered;
output out=try sum=
IDGROUP ( MAX (Moneyraised HoursVolunteered) OUT[2] (moneyraised hoursvolunteered)=max1 max2);
run;
data var1 (keep=name1 _freq_ moneyraised max1_1 max1_2 rename=(moneyraised=value max1_1=largest max1_2=seclargest name1=name))
var2 (keep=name2 _freq_ HoursVolunteered max2_1 max2_2 rename=(HoursVolunteered=value max2_1=largest max2_2=seclargest name2=name));
length name1 name2 $4;
set try ;
name1='VAR1';
name2='VAR2';
run;
data finalmerge;
length flag $1;
set var1 var2;
if largest+seclargest > value*0.9 then flag='Y';
run;
proc中的意味着我选择了moneyraised和hoursvolunredred变量,你将选择var1 var2 var3并在所有程序中进行更改。
IDgroup将输出两个变量的最大值,如括号中所示,但输出[2],显然是最大和第二大。
你必须重命名它们,我选择重命名max1和max 2,然后sas会自动将_1和_2添加到第一个和第二个最大值。
所有输出都在同一行,所以我做了一个datastep引用输出中的2个数据集(数据var1 var2)保留所需的变量,并为下次合并重命名它们,我也选择了一个命名系统。
最后,我将合并创建的2个数据集并添加标记。
答案 1 :(得分:1)
以下是非宏方法中的一些初始步骤和指针,它以不需要进行数组处理的方式重构数据。这种方法应该有助于教你一些关于在SAS中操作数据的方法,但是当它转换和排序数据时,它不会像单个传递方法那样快(就像你最初发布的宏一样)。
首先创建一些漂亮的虚拟数据。
/* Create some dummy data with three variables to assess */
data have;
do firm = 1 to 3;
revenue = rand("uniform");
costs = rand("uniform");
profits = rand("uniform");
output;
end;
run;
转置数据,使所有值都在一列中(变量名称在另一列中)。
/* Move from wide to deep table */
proc transpose
data = have
out = trans
name = Variable;
by firm;
var revenue costs profits;
run;
对数据进行排序,使每个变量位于一组连续的行中,最高值位于每个变量组的末尾。
/* Sort by Variable and then value
so the biggest values are at the end of each Variable group */
proc sort data = trans;
by Variable COL1;
run;
由于这些数据的结构,您可以依次浏览每个观察,创建一个运行总计,当您在变量组中进行最终观察时,将是变量总计。在这个观察中,你也有最大的值(第二个是在之前的观察中)。
此时,您可以创建一个数据步骤:
by
statement让数据步骤了解您的群组first.Variable
temporary variable因此您可以将总变量初始化为0 last.Variable
temporary variable因此您只能输出每个组的最后一行retain
statement因此SAS不会在每次新观察时清空您的总数sum()
function或+
operator创建总计lag()
function或retain
statement保留之前的值(第二大)output
statement请求存储观察keep
statement选择您想要的变量您最初发布的宏看起来像是要执行您正在描述的分析,但有一些额外内容(只有正值会对Total产生影响,可以包含任意数量的值,而不仅仅是前2位,总数乘以另一个变量k1198
,在第二大变量中捕获负值,计算额外标志和值。