我需要帮助来创建这个年龄组变量。在我的数据年龄中,小数点后9位。我可以决定刚选择四分位数的类别。但是我不断收到这些错误...
“错误388-185:需要算术运算符。 错误200-322:该符号无法识别,将被忽略。”
我尝试四舍五入并将le更改为<=,但仍然会给出相同的错误...:(
data sta310.hw4;
set sta310.gbcshort;
age_cat=.;
if age le 41.950498302 then age_cat = 1;
if age > 41.950498302 and le 49.764538386 then age_cat=2;
if age > 49.764538386 and le 56.696966378 then age_cat=3;
if age > 56.696966378 then age_cat=4;
run;
答案 0 :(得分:0)
这件事最好使用proc格式。在您和人工运算符之后,您缺少变量名。您也不需要age_cat =。在一开始的时候。请在您的人工操作员之后添加您的年龄变量,如下所示
data sta310.hw4;
set sta310.gbcshort;
age_cat=.;
if age le 41.950498302 then age_cat = 1;
if age > 41.950498302 and age le 49.764538386 then age_cat=2;
if age > 49.764538386 and age le 56.696966378 then age_cat=3;
if age > 56.696966378 then age_cat=4;
run;
答案 1 :(得分:0)
and le
或and <=
语法不正确。这样的语法可能可能是COBOL所不具备的。
尝试这种SAS Expression形式
<
变量 <=
值 示例
data sta310.hw4;
set sta310.gbcshort;
age_cat=.;
if age <= 41.950498302 then age_cat = 1;
if 41.950498302 < age <= 49.764538386 then age_cat=2;
if 49.764538386 < age <= 56.696966378 then age_cat=3;
if 56.696966378 < age then age_cat=4;
run;
可以使用select
语句来完成类似且更安全的筛子逻辑。
select;
when (age <= 41.950498302) age_cat=1;
when (age <= 49.764538386) age_cat=2;
when (age <= 56.696966378) age_cat=3;
otherwise age_cat=4;
end;
SAS select
与 C switch
语句的不同之处在于,肯定的when
语句流过select
(并且不需要break
中经常看到的switch/case
答案 2 :(得分:0)
问题出在具有多个条件的if语句中。另外,由于age_cat不是数字变量(即,您不希望对该变量求和),我将其设置为长度为1的字符变量,并在格式声明中预先指定(SAS数据管理中的最佳做法) 。 最后,我还建议重新构造您的if else构造,以提高内存效率:
data sta310.hw4;
set sta310.gbcshort;
format age_cat $1.;
if age <= 41.950498302 then age_cat = "1";
else if 41.950498302 < age <= 49.764538386 then age_cat= "2";
else if 49.764538386 < age <= 56.696966378 then age_cat="3";
else age_cat="4";
run;
希望这会有所帮助,
答案 3 :(得分:0)
如果要与四分位数分组,请避免进行硬编码,并使用GROUPS = 4的PROC RANK。小组将是0到3,但想法相同。
proc rank data=sta310.gbcshort out=sta310.hw4 groups=4;
var age;
rank age_cat;
run;
在您当前的程序中,此行/逻辑是您的问题:
if age > 41.950498302 and le 49.764538386 then age_cat=2;
应为:
if 41.950498302 < age <= 49.764538386 then age_cat=2;
您还应该将其切换为IF / ELSE IF而不是IF语句。您应该执行此操作,因为一旦找到类别,它就会停止评估条件,因此不会检查每个IF条件,这会使它稍快一些。这不是您在家庭作业中会注意到的东西,但是如果您要处理更大的数据集,那么了解这一点非常重要。
if age <= 41.950498302 then age_cat = 1;
else if 41.950498302 < age <= 49.764538386 then age_cat=2;
else if 49.764538386 < age <= 56.696966378 then age_cat=3;
else if 56.696966378 < age then age_cat=4;