我们说我有10个变量,都有相同的前缀(它们以com
开头)。
让我们说变量是二进制的,并且有一些丢失的数据,并且我想将所有丢失的数据设置为0.我想为每个变量生成一个新变量原始变量使原始数据完好无损。
我如何一次性重新编码所有这些变量?有一种简单的方法可以在SAS中运行循环吗?如果这是Python或R,我可以使用grep
或类似的东西编写循环来完成所有操作。
编辑:以下是我尝试做的事情。我想使用带有com
变量的无索引数组来创建名为new_com
的副本(使用new
为每个变量添加前缀)。然后我只想重新编码,我知道我可以使用if
then
语句进行重新编码。关于克隆变量的第一部分是我被困住的地方。
答案 0 :(得分:1)
如果您不知道有多少变量但知道您想要的前缀,则编辑以下内容:
data test;
input coma comet compton communism come comb community comerade complete comma;
datalines;
1 1 1 0 0 . 0 0 1 .
;
run;
%let prefix=com;
/* output the list of variables and only keep those with prefix */
proc contents data = test noprint out=names(keep=name varnum); run;
proc sort data = names;
by varnum;
run;
/* create your new variable with a "new_" prefix */
data names1; set names;
if index(name,"&prefix.");
new_name = "new_"||strip(name);
run;
/* put lists into macro variables */
proc sql noprint;
select name
into: old_vars separated by " "
from names1;
select new_name
into: new_vars separated by " "
from names1;
select count(*)
into: nobs
from names1;
quit;
%put &old_vars.;
%put &new_vars.;
%put &nobs.;
/* use array and macro variables to manipulate data */
data test1; set test;
array old(&nobs.) &old_vars.;
array new(&nobs.) &new_vars.;
do i=1 to &nobs.;
if old(i) = . then new(i) = 0;
else new(i) = old(i);
end;
drop i;
run;
答案 1 :(得分:1)
假设您已获得SAS / STAT许可,则最简单的方法是使用Aborting response due to origin not allowed
:
PROC STDIZE
data have;
array com[10];
call streaminit(7);
do _j = 1 to 10;
do _i = 1 to 10;
if rand('Uniform') < 0.2 the com[_i]=.;
else com[_i]=1;
end;
output;
end;
run;
proc stdize data=have out=have_zero missing=0 reponly sprefix=new_ oprefix=old_;
var com:;
run;
表示不进行任何标准化(仅针对缺失归零),reponly
和sprefix
指定标准化和原始变量的前缀。