输出具有SAS表测试结果的表的宏

时间:2015-03-24 19:54:26

标签: sas

问题

我不是一位经验丰富的SAS用户,但不幸的是,我可以访问数据的实验室仅限于SAS。此外,我目前无法访问数据,因为它仅在实验室中可用,因此我创建了用于测试的模拟数据。

我需要创建一个从PROC MEANS表中获取值和维度的宏,并执行一些测试,检查数据中前两个值是否占结果的90%。

例如,假设我有面板数据列出公司的收入,成本和利润。我创建了一个列出n,sum,mean,median和std的表。现在我需要检查排名前两位的公司是否构成了90%的结果,如果是,则标记它的利润,收入或成本是否占90%。

我不确定如何开始

以下是步骤:

  1. 阅读数据

  2. 阅读创建的PROC MEAN表格,获取尺寸和变量。

  3. 在每个变量中获得前两名公司并执行检查

  4. 创建新表,列出变量,读取表中的值,最大和第二大值以及标记。

  5. 然后打印表

  6. 模拟数据:

    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;
    

    enter image description here

    期望的结果:

            Value        Largest     Sec. Largest       Flag
    V1     463138.09     9888.09       9847.13     
    V2     148.92        1.99           1.99      
    V3     11503375      9999900       1000000           Y
    

2 个答案:

答案 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;

由于这些数据的结构,您可以依次浏览每个观察,创建一个运行总计,当您在变量组中进行最终观察时,将是变量总计。在这个观察中,你也有最大的值(第二个是在之前的观察中)。

此时,您可以创建一个数据步骤:


您最初发布的宏看起来像是要执行您正在描述的分析,但有一些额外内容(只有正值会对Total产生影响,可以包含任意数量的值,而不仅仅是前2位,总数乘以另一个变量k1198,在第二大变量中捕获负值,计算额外标志和值。