【问题标题】:SAS-Adding a Zero where condition not metSAS-在不满足条件的情况下添加零
【发布时间】:2015-07-02 16:25:53
【问题描述】:

对此的任何帮助将不胜感激。我正在尝试根据特定 ID 是否提交特定代码为我的数据添加“0”值。为了更好地说明我在这里尝试做的是一个示例数据集,其中应该表示三个 ID 和三个代码,然后是我想要的。

ID    Submitted_Code  Times_Submitted    Cost_Per_Each
A      42              10                  15.00
A      43               5                  30.00
B      44               6                  35.00
C      42               5                  15.00
C      43               7                  30.00
C      44               8                  35.00

对于每个未提交代码的 ID,将显示未提交的代码,后跟零表示提交的次数。就这样

   ID    Submitted_Code  Times_Submitted    Cost_Per_Each
    A      42              10                  15.00
    A      43               5                  30.00
    A      44               0                  35.00
    B      42               0                  15.00
    B      43               0                  30.00
    B      44               6                  35.00
    C      42               5                  15.00
    C      43               7                  30.00
    C      44               8                  35.00

谢谢!

【问题讨论】:

  • 您能否提供一些代码来展示您到目前为止所尝试的内容? Stackoverflow 不是代码编写服务。谢谢=)
  • this question;您可以使用该技术生成仅缺少 A/B/etc 的数据集。数据。您需要附加 cost_per_each。
  • 这里的问题是您需要以某种方式告诉 SAS 哪些 ID/代码组合应该在您的表中。有很多方法可以做到这一点。有关选项,请参阅此类似问题:stackoverflow.com/questions/28822470/…

标签: if-statement sas proc-sql


【解决方案1】:

感谢大家的帮助和建议,我能够使用上述建议的补丁,使用稀疏函数然后使用左连接重新加入来做到这一点。再次感谢所有建议。

 /*Creating a table that creates all possible Combinations of Provider-Revenue Code for all Provider showing up in data*/
    proc freq data=ID_Code_breakdown noprint;
    tables ID*Code/sparse out=want(drop=percent);
    run;

/*Then merge with main table to get all possible combinations*/
    PROC SQL;
    CREATE TABLE LEFT1 AS
    SELECT A.*, B.HIC_COUNT, B.Amount_Total_Paid
    FROM want A LEFT JOIN ID_code_breakdown B
    ON A.Id = B.Id AND A.Code = B.Code
    ORDER BY Id;
    quit;

/*Replace missing value .'s with 0's*/
    data LEFT2;                 
       set LEFT1;               
       array change _numeric_;
                do over change;
                if change=. then change=0;
                end;
       run;

【讨论】:

    【解决方案2】:

    我想你有两张桌子。一个带有提交的代码(假设表已提交)和另一个主表具有所有可能的 ID 和提交的代码(假设表主)。以下代码是创建示例数据

    data submitted;
      input ID $1 Submitted_Code Times_Submitted;
    datalines;
      A 42 10
      A 43 5
      B 44 6
    run;
    
    data master;
      input ID $1 Submitted_Code ;
    datalines;
      A 42
      A 43
      A 44
      B 42
      B 44
    run;
    

    然后您可以使用 PROC SQL 将提交的表与主表进行左连接。 coalesce 函数可用于将缺失的 Submitted_Time 值设置为 0。

    proc sql;
      create table foo as select 
      a.ID, a.Submitted_Code, Coalesce(b.Times_Submitted,0) As Times_Submitted
      from master a 
      left join submitted b
      on a.ID = b.ID and a.Submitted_Code = b.Submitted_Code;
    quit;
    

    【讨论】:

    • 这需要一些解释你在代码之外所做的事情,我想 OP 不想硬编码数据中的异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2018-01-17
    • 1970-01-01
    • 2021-07-14
    • 2020-02-09
    • 2019-02-03
    • 2015-05-16
    相关资源
    最近更新 更多