我在获取 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。
我想出的一种解决方法是为红色、绿色、蓝色和黄色中的每一个创建四种单独的格式,但这效率低下,我想知道我可以修复什么来让上面的单一格式适用于所有四个标签?
我知道这可能是一个混乱的解释,所以请随时提出问题,我会尽力澄清。
谢谢你的帮助!