我目前正在使用SAS Studio免费版,我刚开始(大约2周)。我以前是MATLAB用户,但SAS更复杂^^。
首先,我创建了一个新表,我从库SASHELP.cars中计算了2个变量(MSRP和Invoice)的第25,第50和第75百分位数。我得到了一个包含单行和6列的新表(2个变量为3个百分位)。我将百分位数命名为Invoice_P25等。
这是代码,如果它可以帮助你,我也把代码和我想要在附件中生成的内容:
proc univariate data=work.Regress noprint;
var MSRP Invoice;
output out=work.temp1 pctlpts=25 50 75 pctlpre=MSRP_ Invoice_
pctlname=P25 P50 P75; /* Compute 25th, 50th and 75th quantiles */
run;
这是我的问题:
有了这些百分位数,我想创建一个表,其中列说明汽车的MSRP在哪里,与其余的MSRP分布进行比较。 “发票”也是如此。
我尝试使用带有“if”的结构。但当我将一个列(428行MSRP)与百分位数进行比较时,它不能与其名称一起使用,但如果我用它的值替换,它就可以工作。我认为SAS认为百分位数是一个列也有428行,但只有第一行有一个值。
我该如何解决?这是我的代码:
data work.temp;
set work.Regress work.temp1;
/* (keep=var1 var2)
(drop=var1 var2) */
length QMSRP $6; /* longueur de nouvelle colonne = 6 caractères */
if MSRP < vvalue(MSRP_P25) then QMSRP = 'QMSRP1';
else if MSRP >= vvalue(MSRP_P25) and MSRP < vvalue(MSRP_P50) then QMSRP = 'QMSRP2';
else if MSRP >= vvalue(MSRP_P50) and MSRP < vvalue(MSRP_P75) then QMSRP = 'QMSRP3';
else QMSRP = 'QMSRP4';
length QInvoice $9;
if Invoice < Invoice_P25 then QInvoice = 'QInvoice1';
else if Invoice >= Invoice_P25 and Invoice < Invoice_P50 then QInvoice = 'QInvoice2';
else if Invoice >= Invoice_P50 and Invoice < Invoice_P75 then QInvoice = 'QInvoice3';
else QInvoice = 'QInvoice4';
run;
PS:对不起,如果图片中的某些单词是法语,我无法更改语言。
答案 0 :(得分:0)
您的代码告诉SAS读取REGRESS数据集,然后读取TEMP1数据集。所以你会得到像
这样的东西Obs MSRP ... P25
1 1,000 .
2 5,000 .
...
N+1 . 2,250
但听起来你想在每次观察REGRESS时都想要P25等的值。所以在这种情况下只需读取一次值。由于它们来自数据集,因此它们将保留在数据步骤中的所有观察值上。
data want ;
set regress ;
if _n_=1 then set temp1;
....
这样你就可以获得这样的价值。
Obs MSRP ... P25
1 1,000 2,250
2 5,000 2,250
...
N 4,000 2,250