2017-10-18 100 views
-1

combd datasetSAS if-else if not working

SAS正在检查第一个if语句,并且由于某种原因忽略其他语句。对于一对夫妇obs“class”= 1,对于所有其他人,它是空白的。我该怎么办?我确实需要括号将这些“或”语句分组。附加的是梳理数据集。刚刚注意到,在SAS中class = 1的obs是错误的!

data clustered; 
set combd; 
if ((393821 ge avpm le 450041) or (337601 ge avpm le 393821) or (225161 
    ge avpm le 281381)) and (.8768 ge fsp le 1) then class='1'; 
    else if ((112720 ge avpm le 168940) or (56500 ge avpm le 112720) or 
    (280.06 ge avpm le 56500)) and (.8768 ge fsp le 1) then class='2'; 
    else if (280.06 ge avpm le 56500) and ((.507 ge fsp le .6303) or 
     (.3838 ge fsp le .507) or (.2606 ge fsp le .3838)) then class='3'; 
     else if (280.06 ge avpm le 56500) and ((.1373 ge fsp le .2606) or 
     (.0141 ge fsp le .1373)) then class='4'; 
      else if (280.06 ge avpm le 56500) and (.8768 ge fsp le 1) then 
      class='5'; 
      else if (280.06 ge avpm le 56500) and ((.8768 ge fsp le 1) or 
      (.7535 ge fsp le .8768) or (.6303 ge fsp le .7535)) then 
       class='6'; 
       run; 
+1

必须有一个原因,否则if if条件为真。我不认为没有输入样本,任何人都可以告诉你为什么。 – Petr

+0

Ok Petr。所以你非常自信有没有写错代码,因为我写了它? – mbs23

+0

我没有看到任何语法问题。我现在要尝试的第一件事是检查输入数据与剩余的“else if”条件。或者,您可以发布数据样本。 – Petr

回答

2

这是错误的:

(393821 ge avpm le 450041) 

任何小于393821也将低于450041.

你想这样的:比AVPM少得

(393821 le avpm le 450041) 

393821比450041,意味着,avpm介于393821和450041之间。对所有数据都这样做。

第二:不要这样写你的代码。这很难阅读,也很难调试。而应使用数据驱动的代码方法。

你们这里真的有关系吧? [一些AVPM值]和[一些FSP值] - > [某类值]

因此,让一个表:

data class; 
input class avpm_min avpm_max fsp_min fsp_max; 
datalines; 
1 393821 450041 .8768 1 
1 337601 393821 .8768 1 
1 225161 281381 .8768 1 
2 112720 168940 .8768 1 
2 056500 112720 .8768 1 
2 280.06 056500 .8768 1 
3 280.06 056500 .5070 .6303 
3 280.06 056500 .3838 .5070 
3 280.06 056500 .2606 .3838 
6 280.06 056500 .6303 .7535 
6 280.06 056500 .7535 .8768 
;;;; /*more datalines of course */ 
run; 

然后再拿PROC SQL加入这个到主表。

data your_data; 
input avpm fsp; 
obs=_n_; 
datalines; 
13026.14 .81888 
1810.57 .84959 
3859.84 .85593 
3290.61 .57513 
10704.72 .71414 
;;;; 
run; 

proc sql; 
    select d.obs, d.avpm, d.fsp, c.class from 
    your_data d 
    left join class c 
    on c.avpm_min le d.avpm le c.avpm_max 
    and c.fsp_min le d.fsp le c.fsp_max 
    order by d.obs 
    ; 
quit; 

你走了。

我还会注意到你的IF/ELSE组合对于4/5/6没有意义。 5是不可能的(它完全被2包含),6的一部分也是。

+0

我还会注意到,可能性是,你*已经拥有一个像'class'这样的表:你可能通过某种聚类过程或类似的东西来创建这些类的值,对吧?所以你可能不需要这样做。只需直接使用该表(如果您在proc上没有“out”选项,则使用“ods output”将其作为表)。 – Joe

+0

我没跟随你乔。 “任何少于450041的数字也将少于393821。” 450000小于450041但不小于393821.我错过了什么? – mbs23

+0

集群的边界来自企业矿工14.1,它不提供表格。 – mbs23