Loops sas:一次重新编码一组变量
假设我有10个变量,都有相同的前缀(它们以Loops sas:一次重新编码一组变量,loops,sas,sas-macro,Loops,Sas,Sas Macro,假设我有10个变量,都有相同的前缀(它们以com开头) 假设变量是二进制的,有一些缺少的数据,我想把所有缺少的数据都设置为0。我想为每个原始变量生成一个新变量,这样原始数据就完好无损了 我将如何一次重新编码所有这些变量?有没有一种简单的方法可以在SAS中运行循环?如果这是Python或R,我可以使用grep或类似的东西编写一个循环来完成这一切 编辑:以下是我要做的。我想使用带有com变量的未索引数组来创建名为new\u com(在每个变量前面加new)的副本。然后我只想重新编码,我知道我可以使用
com
开头)
假设变量是二进制的,有一些缺少的数据,我想把所有缺少的数据都设置为0。我想为每个原始变量生成一个新变量,这样原始数据就完好无损了
我将如何一次重新编码所有这些变量?有没有一种简单的方法可以在SAS中运行循环?如果这是Python或R,我可以使用grep
或类似的东西编写一个循环来完成这一切
编辑:以下是我要做的。我想使用带有
com
变量的未索引数组来创建名为new\u com
(在每个变量前面加new
)的副本。然后我只想重新编码,我知道我可以使用if
Then
语句来完成。第一部分,关于克隆变量,是我遇到的问题。如果您不知道有多少变量,但知道所需的前缀,则编辑下面的内容:
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;
如果您不知道有多少变量,但知道所需的前缀,则会编辑以下内容:
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;
假设您拥有SAS/STAT许可证,那么使用
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;
数据已经存在;
数组com[10];
调用streaminit(7);
do_j=1到10;
do_i=1至10;
如果兰德(‘统一’)小于0.2,则com[_i]=。;
else com[_i]=1;
结束;
产出;
结束;
跑
proc stdize data=have out=have\u zero missing=0 reponly sprefix=new\uoprefix=old\ux;
var-com:;
跑
reponly
表示不进行任何标准化(仅为缺失的变量输入零),sprefix
和oprefix
指定标准化变量和原始变量的前缀。假设您已获得SAS/STAT许可,使用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;
数据已经存在;
数组com[10];
调用streaminit(7);
do_j=1到10;
do_i=1至10;
如果兰德(‘统一’)小于0.2,则com[_i]=。;
else com[_i]=1;
结束;
产出;
结束;
跑
proc stdize data=have out=have\u zero missing=0 reponly sprefix=new\uoprefix=old\ux;
var-com:;
跑
reponly
表示不进行任何标准化(仅为缺失输入零),sprefix
和oprefix
指定标准化变量和原始变量的前缀。您可以使用if语句定义每个新变量,例如if com1=。那么com1_nm=0;否则com1_nm=com1;或者,由于这将是相当重复的,您可以使用do循环和数组来节省编写大量代码的时间。谢谢,这很有帮助,但是有两个问题:我需要使用前缀重命名变量,我不需要在数组中单独列出每个变量,而是使用一些通配符。您可以使用if语句定义每个新变量,例如if com1=。那么com1_nm=0;否则com1_nm=com1;或者,由于这将是相当重复的,您可以使用do循环和数组来节省编写大量代码的时间。谢谢,这很有帮助,但是有两个问题:我需要使用前缀重命名变量,我不需要在数组中单独列出每个变量,而是使用一些通配符。有关于如何做到这一点的见解吗?如果我没有呢?有没有办法告诉SAS查找old
的长度?我编辑了上面的代码以反映这一点。你只需要知道你的前缀,你应该被设置好。如果我不知道呢?有没有办法告诉SAS查找old
的长度?我编辑了上面的代码以反映这一点。你需要知道的是你的前缀,你应该被设置。如果你想让原始变量保持它们的名称,请使用不带前缀的OPREFIX选项。编辑:嗯,我第一次这么做时它不起作用,但现在它起作用了……如果你想让原始变量保持它们的名称,请使用不带前缀的OPREFIX选项。编辑:嗯,我第一次做的时候它不起作用,但现在它起作用了。。。