根据其他列中的观察结果创建新列

时间:2015-12-24 17:06:00

标签: sas proc-sql

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

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

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。如果在& amp;和/或b& c& d&但它不是为我做的,也许是由于缺少价值。

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

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

我也尝试过Proc SQL,但我一直专注于数据步骤,但任何帮助都会很棒。

谢谢!

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

SELECT A, B, C, D, E,
       CASE WHEN A+B+C+D > 1 THEN 1 END AS R
FROM   Table;

(道歉,如果我做了任何语法滑动,我的SAS SQL有点生疏。)

答案 2 :(得分:0)

您可以执行查询来执行此操作。 。 。虽然我认为数据步骤非常合理。以下是在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

答案 3 :(得分:0)

数据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)&lt; = 1时。
从a结束为R;
更新a1集A =。,B =。,C =。,D =。,E =。
其中R = 1;
退出;


输出

Obs A B C D E R
1。 。 。 。 。 1
2。 1。 。 。 。
3。 。 。 。 。 1个