proc排名在sas

时间:2011-08-16 17:36:51

标签: sas proc-sql

我的数据集有两个变量ID和诊断。我正在尝试根据ID和诊断在我的数据集中分配行号。

我使用的代码是;

proc sort data = temp;
by ID diagnosis;
run;

proc rank data = temp out  = temp1;
by id;
var diagnosis;
ranks = diag_rank;
run;

给出mr错误:列表中的变量诊断与类型

不匹配

我知道我的诊断有文字和数字值。有没有办法来解决这个问题。非常感谢。

3 个答案:

答案 0 :(得分:3)

如果您只是寻找一个唯一的行号,那么以下内容应该有效。

data temp;
   set temp;
   retain row_number 0;
   row_number + 1;
run;

如果您需要基于ID和诊断的条件行号,请尝试:

data temp;
   set temp;
   by ID diagnosis;
   retain row_number;
   if first.ID then do;
      row_number = 0;
   end;
   row_number + 1;
run;

另一方面,如果除了排序的字符值之外,您希望对DIAGNOSIS变量施加一些明确的排名顺序,那么您可以使用用户定义的格式将每个字符值映射到数字,然后使用此格式在数据步骤中创建row_number变量,如下所示。

proc format;
   value $diag_row
   "67"   = 2
   "A234" = 4
   "B45"  = 3
   "V456" = 1
   other  = 999
   ;
run;

data temp;
   set temp;
   format row_number 8.0;
   row_number = put(diagnosis,$diag_row.);
run;

答案 1 :(得分:0)

Nupur,VAR语句只需要数字变量。如果DIAGNOSIS定义为字符但仅包含数值,则使用INFORMAT语句创建新的数字变量。将以下内容添加到示例的开头,它应该可以工作:

data temp;
   set temp(rename=(diagnosis=diag_char));
   format diagnosis 8.0;
   diagnosis = input(diag_char , 8.0);
   drop diag_char;
run;

但是,如果您的DIAGNOSIS包含字符值,那么您需要重新分类诊断或将值转换为数值(如果有意义的话)。

答案 2 :(得分:0)

如果您只想使用行号,可以使用默认变量" _ N _"没有引号和空格。

如果是有条件的,你可以按照Rwill的回答......