代码之家  ›  专栏  ›  技术社区  ›  ISemsem

将具有多行的列与具有单行的列进行比较[重复]

sas
  •  0
  • ISemsem  · 技术社区  · 9 年前

    我目前正在使用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分布进行比较。与“发票”相同。

    当我将一列(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 回复  |  直到 9 年前
        1
  •  0
  •   Tom    9 年前

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

    Obs MSRP ... P25
      1 1,000    . 
      2 5,000    .
    ...
    N+1     .   2,250
    

    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
    
    推荐文章