输出带有SAS表测试结果的表的宏 问题

输出带有SAS表测试结果的表的宏 问题,sas,Sas,我不是一个非常有经验的SAS用户,但不幸的是,我可以访问数据的实验室仅限于SAS。此外,我目前无法访问数据,因为它只在实验室中可用,所以我创建了模拟数据进行测试 我需要创建一个宏,从PROC MEANS表中获取值和维度,并执行一些测试,检查数据中前两个值是否占结果的90% 举个例子,假设我有列出公司收入、成本和利润的面板数据。我已经创建了一个表格,列出了n、总和、平均数、中位数和标准差。现在我需要检查前两名公司是否占了结果的90%,如果是,则标记占90%的是利润、收入还是成本 我不知道如何开始

我不是一个非常有经验的SAS用户,但不幸的是,我可以访问数据的实验室仅限于SAS。此外,我目前无法访问数据,因为它只在实验室中可用,所以我创建了模拟数据进行测试

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

举个例子,假设我有列出公司收入、成本和利润的面板数据。我已经创建了一个表格,列出了n、总和、平均数、中位数和标准差。现在我需要检查前两名公司是否占了结果的90%,如果是,则标记占90%的是利润、收入还是成本

我不知道如何开始

以下是步骤:

  • 读取数据

  • 阅读创建的
    PROC MEAN
    表格,获取维度和变量

  • 在每个变量中获得前两名公司并进行检查

  • 创建新表,列出变量、读取表中的值、最大值和第二大值以及标志

  • 然后打印表格

  • 模拟数据:

    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;
    

    预期结果:
    以下是非宏方法中的一些初始步骤和指针,该方法以无需数组处理的方式重新构造数据。这种方法应该可以很好地教会您如何在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;
    
    转换数据,使所有值都在一列中(变量名在另一列中)

    对数据进行排序,使每个变量位于连续的行组中,并且最大值位于每个变量组的末尾

    /* 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;
    
    由于该数据的结构,您可以依次遍历每个观察值,创建一个运行总数,当您到达变量组中的最终观察值时,该总数将是变量总数。在本次观察中,您还有最大的值(第二个最大值出现在上一次观察中)

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

    • 当它位于每个变量组的第一个和最后一个值中时,会被识别
      • 使数据步骤了解您的组
      • 因此,您可以将总变量初始化为0
      • 因此,您只能输出每组的最后一行
    • 总结每组中的值
      • 所以SAS不会在每次新观察中清空你的总数
      • 或创建您的总
    • 为每个组中的最大值和第二大值创建并填充新变量
      • 或保留上一个值(第二大值)
    • 创建您的旗帜
    • 在每组末尾输出新变量
      • 请求保存观察结果
      • 选择所需变量的步骤


    您发布的宏最初看起来像是要执行您描述的分析,但有一些额外的功能(只有正值对总量有贡献,可以包括任意数量的值,而不仅仅是前2个,总量乘以另一个变量
    k1198
    ,第二大变量中的负值,计算额外的标志和值).

    以下是非宏方法中的一些初始步骤和指针,该方法以不需要数组处理的方式重新构造数据。该方法应该有助于教您如何在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;
    
    转换数据,使所有值都在一列中(变量名在另一列中)

    对数据进行排序,使每个变量位于连续的行组中,并且最大值位于每个变量组的末尾

    /* 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;
    
    由于该数据的结构,您可以依次遍历每个观察值,创建一个运行总数,当您到达变量组中的最终观察值时,该总数将是变量总数。在该观察值中,您还有最大的值(第二大值是在前一个观察值中)

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

    • 当它位于每个变量组的第一个和最后一个值中时,会被识别
      • 使数据步骤了解您的组
      • 因此,您可以将总变量初始化为0
      • 因此,您只能输出每组的最后一行
    • 总结每组中的值
      • 所以SAS不会在每次新观察中清空你的总数
      • 或创建您的总
    • 为每个组中的最大值和第二大值创建并填充新变量
      • 或保留上一个值(第二大值)
    • 创建您的旗帜
    • 在每组末尾输出新变量
      • 请求保存观察结果
      • 选择所需变量的步骤


    您发布的宏最初看起来像是要执行您描述的分析,但有一些额外的功能(只有正值对总量有贡献,可以包括任意数量的值,而不仅仅是前2个,总量乘以另一个变量
    k1198
    ,第二大变量中的负值,计算额外的标志和值).

    目前我无法打开您的模拟数据集,但我可以给您一些建议,希望它们能有所帮助

    可以使用“output out=”语句添加给定变量的n个极值
    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;