0

我在获取 proc 格式和数据提取工作时遇到了一些麻烦。首先,这是我正在创建的格式的代码:

data main_code;
  length fmtname $32 type $1 start $8 label $20 hlo $1;
  keep fmtname type start label hlo ;
  type='C';
  hlo='M';
  set lib.code_data ;
  fmtname='source';
  start=code;
  label=source_colors;
  output;
run;
proc sort nodupkey ; by fmtname start label ; run;
proc format cntlin=main_code; run;

上面的代码旨在基于我已经导入 SAS 的名为 code_data 的 .csv 创建格式。.csv 的“source_colors”列包含四个不同的标签:红色、绿色、蓝色和黄色。每个标签对应 .csv 中的一个代码,并且在某些情况下,一个代码会出现在多个标签上。

以下代码是我试图在这种格式之后运行的数据拉取:

data lib.new_data (keep = red: green: blue: yellow: i10_pr1-i10_pr31);
set lib.old_data;
array proc_cd_{*} i10_pr1-i10_pr31;
red=0;
    green=0;
    blue=0;
    yellow=0;
do i=1 to 31;
            if put(proc_cd_{i}, $source.)= "Red" then do;
                            red=1;
                            red_qual_pr=proc_cd_{i};
                            red_qual_pr_pos=(i);
            end;
end;
do i=1 to 31;
            if put(proc_cd_{i}, $source.)= "Green" then do;
                            green=1;
                            green_qual_pr=proc_cd_{i};
                            green_qual_pr_pos=(i);
            end;
end;
do i=1 to 31;
            if put(proc_cd_{i}, $source.)= "Blue" then do;
                            blue=1;
                            blue_qual_pr=proc_cd_{i};
                            blue_qual_pr_pos=(i);
            end;
end;
do i=1 to 31;
            if put(proc_cd_{i}, $source.)= "Yellow" then do;
                            yellow=1;
                            yellow_qual_pr=proc_cd_{i};
                            yellow_qual_pr_pos=(i);
            end;
end;

这里的主要问题是 do 循环似乎不起作用。“红色”和“绿色”应该以相似数量的代码出现在最终数据集中,但最终发生的情况是,如果红色和绿色出现代码,则此数据拉取将跳过红色,只给绿色值 1。每当标签以 $source 格式出现时,我需要它给出红色和绿色值 1。

我想出的一种解决方法是为红色、绿色、蓝色和黄色中的每一个创建四种单独的格式,但这效率低下,我想知道我可以修复什么来让上面的单一格式适用于所有四个标签?

我知道这可能是一个混乱的解释,所以请随时提出问题,我会尽力澄清。

谢谢你的帮助!

4

0 回答 0