将具有多行的列与具有单行

时间:2017-07-15 00:22:18

标签: sas

我目前正在使用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:对不起,如果图片中的某些单词是法语,我无法更改语言。

SASCode + Table wanted

1 个答案:

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