Sas 将具有多行的列与具有单行的列进行比较

Sas 将具有多行的列与具有单行的列进行比较,sas,Sas,我目前正在使用SAS Studio免费版,我才刚刚开始(大约2周)。我以前是MATLAB用户,但SAS要复杂得多 首先,我创建了一个新表,在表中,我从SASHELP.cars库中计算了两个变量(MSRP和发票)的第25、50和75个百分位。我得到了一个新表,它有一行六列(2个变量有3个百分位数)。我将百分位数命名为发票\ P25等 以下是代码(如果可能对您有所帮助),我还将代码和我希望生成的内容放在附件中: proc univariate data=work.Regress noprint;  

我目前正在使用SAS Studio免费版,我才刚刚开始(大约2周)。我以前是MATLAB用户,但SAS要复杂得多

首先,我创建了一个新表,在表中,我从SASHELP.cars库中计算了两个变量(MSRP和发票)的第25、50和75个百分位。我得到了一个新表,它有一行六列(2个变量有3个百分位数)。我将百分位数命名为发票\ 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分布相比较。与“发票”相同

我尝试了一个带有“如果”的结构。但是当我将一列(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;
data work.temp;
设定工作。回归工作。temp1;
/*(keep=var1 var2)
(drop=var1 var2)*/
 
长度QMSRP$6;/*新科隆长=6克拉*/
如果MSRP=v值(MSRP_P25)和MSRP=vvalue(MSRP_P50)和MSRP=发票P25和发票<发票P50,则QInvoice='QInvoice2';
否则,如果发票>=发票第50页和发票<发票第75页,则QInvoice='QInvoice3';
else QInvoice='QInvoice4';
 
跑
PS:抱歉,如果图片中有法语单词,我无法更改语言


您的代码告诉SAS读取回归数据集,然后读取TEMP1数据集。所以你会得到这样的结果

Obs MSRP ... P25
  1 1,000    . 
  2 5,000    .
...
N+1     .   2,250
但听起来你想知道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

你这样做是为了锻炼吗?在SAS中,这绝对不是最好的方法。最好使用PROC RANK with GROUPS=4为您创建组。或组=10,如果需要十分位数。或者100,如果你想要实际的百分位数。我想你们明白了。我这里有一个宏,但宏可能超出了你们现在知道的范围。非常感谢,它工作了,问题解决了。