【问题标题】:creating a new column based on observations in other columns根据其他列中的观察结果创建新列
【发布时间】:2015-12-24 17:05:59
【问题描述】:

我在使用条件创建新变量时遇到问题,我尝试了数据步骤但无济于事。

我的数据集现在看起来像这样:

A B C D E
1 . 1 1 .
. 1 . . . 
1 . 1 . 1 

我需要看起来像这样

A B C D E R
. .  .  . 1
. 1 . . . .
. . . . . 1

所以我使用的想法是如果 a - d 的总和大于 1,则设置 R 等于 1 else 。如果 1 存在于 a & b & c & d & e 中,则删除观察结果,但它不为我做这可能是由于缺失值。

到目前为止我使用过的代码:

data campZ;
set campY;
select;
when (sum(Macroscopic -- Symbolic > 1)) Random = 1;
otherwise; end; 
run;

我也尝试过 Proc SQL,但我主要关注数据步骤,但任何帮助都会很棒。

谢谢!

【问题讨论】:

    标签: sas proc-sql


    【解决方案1】:

    看起来您既要设置 R 又要清除其他变量。使用变量列表作为函数的参数时,需要添加 OF 关键字。

    data campZ;
      set campY;
      if sum(of Macroscopic -- Symbolic) > 1 then do;
         Random = 1;
         call missing(of Macroscopic -- Symbolic);
      end;
    run;
    

    【讨论】:

      【解决方案2】:
      SELECT A, B, C, D, E,
             CASE WHEN A+B+C+D > 1 THEN 1 END AS R
      FROM   Table;
      

      (抱歉,如果我有任何语法失误,我的 SAS SQL 有点生疏了。)

      【讨论】:

      • 我也试过这个,但它没有给我想要的输出,但现在已经解决了。谢谢!
      【解决方案3】:

      您可以执行查询来执行此操作。 . .虽然我认为数据步骤是相当合理的。这是在proc sql 中执行上述操作的一种方法。

      proc sql
          select (case when cnt <= 1 then a end) as a,
                 (case when cnt <= 1 then b end) as b,
                 (case when cnt <= 1 then c end) as c,
                 (case when cnt <= 1 then d end) as d,
                 (case when cnt <= 1 then e end) as e,
                 (case when cnt > 1 then 1 end) as r
          from (select z.*,
                       ((case when a is null then 0 else 1 end) +
                        (case when b is null then 0 else 1 end) +
                        (case when c is null then 0 else 1 end) +
                        (case when d is null then 0 else 1 end) +
                        (case when e is null then 0 else 1 end)
                       ) as cnt
      
                from campz z
               ) z ;
      

      这只是返回值。如果您希望它们在新数据集中,请使用create table as

      【讨论】:

      • 非常感谢,效果很好!你能解释一下campz z ) z中的“什么”吗?是什么意思?
      • 表达式campz z 将别名z 分配给compz。表别名是 SQL 语言的重要组成部分。
      【解决方案4】:

      数据a;
      输入 A B C D E;
      卡片;
      1. 1 1 .
      . 1. . .
      1. 1. 1
      ;

      proc sql noprint;
      创建表 a1 为
      选择 *,大小写
      当 sum(a,b,c,d,e)>1 然后 1
      当 sum(a,b,c,d,e) 从 a 以 R 结尾;
      更新 a1 设置 A=., B=., C=., D=., E=.
      其中 R=1;
      退出;

      输出

      Obs A B C D E R
      1. . . . . 1
      2. 1. . . .
      3. . . . . 1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 2022-09-23
        相关资源
        最近更新 更多