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