如何随机 select SAS中的变量?
How to randomly select variables in SAS?
我可以找到关于如何在 SAS 中随机 select 观察的各种信息,这是一项相当容易的任务。这不是我需要的。我需要随机 select 个变量。我特别想做的是从我的 159 个变量列表中随机选择 20 个变量,然后重复 50 次。我也想确保多样性。我已经在这上面花了大约两天时间了,但没有运气。
很高兴您提出这个问题,因为我刚刚为此开发了一个解决方案!让我们一步一步地详细说明需要做什么。
第0步:我们需要做什么?
我们需要一种方法来获取所有变量并随机获取其中的 select 20 个,同时将它们保持在 SAS 语言规则的范围内。
我们需要:
- 数据集中的所有变量
- 一种随机重新排序的方法
- 限制为 20 个变量
- 循环 50 次的方法
让我们从 1 开始。
第 1 步:获取所有变量
sashelp.vcolumn
提供数据集中所有变量的列表。让我们 select 他们全部。
proc sql noprint;
create table all_vars as
select name
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
;
quit;
这为我们提供了数据集中所有变量的列表。现在,我们需要对它们进行随机排序。
第 2 步:使它们随机化
SAS 提供了 rand
函数,允许您从任何您喜欢的分布中提取。您可以在 rand
函数之前使用 call streaminit(seedhere)
来设置特定的种子,从而创建可重现的结果。
我们将简单地修改我们原来的 SQL 语句并使用 rand()
函数对数据集进行排序。
data _null_;
call streaminit(1234);
run;
proc sql noprint;
create table all_vars as
select name
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform');
quit;
现在我们所有的变量都是随机排列的,按 uniform
分布均匀分布。
第 3 步:限制为 20 个变量
您可以通过几种方式做到这一点。一种方法是单独过程中的 obs=
数据集选项,另一种方法是 outobs=
proc sql
选项。就个人而言,我喜欢 obs=
数据集选项,因为它不会在日志中生成警告,并且可以在其他过程中使用。
data _null_;
call streaminit(1234);
run;
proc sql noprint outobs=20;
create table all_vars as
select name
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform');
quit;
第 4 步:循环 50 次
我们将使用 SAS 宏语言来完成这一部分。我们可以通过这种方式创建 50 个单独的数据集,或者稍微切换代码并将它们读入宏变量。
%macro selectVars(loop=50, seed=1234);
data _null_;
call streaminit(&seed);
run;
%do i = 1 %to &loop;
proc sql noprint outobs=20;
create table all_vars&i as
select name
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform')
;
quit;
%end;
%mend;
%selectVars;
或者,选项 2:
%macro selectVars(loop=50, seed=1234);
data _null_;
call streaminit(&seed);
run;
%do i = 1 %to &loop;
proc sql noprint outobs=20;
select name
into :varlist separated by ' '
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform')
;
quit;
%end;
%mend;
%selectVars;
第二个选项将创建一个名为 &varlist
的局部宏变量,其中随机 20 个变量由空格分隔。这对于各种建模过程来说很方便,并且更可取,因为它不会每次都创建一个单独的数据集。
希望对您有所帮助!
您需要将元数据视为数据并使用 SURVEYSELECT 进行 select 观察。然后也许将这些名称放入宏变量但您没有提到您想要的确切输出。
data v;
array rvars[159];
run;
proc transpose data=v(obs=0) out=vars name=name;
var rvars:;
run;
proc surveyselect reps=4 sampsize=20 data=vars out=selection;
run;
proc transpose data=selection out=lists(drop=_:);
by replicate;
var name;
run;
proc print;
run;
data _null_;
set lists;
by replicate;
call symputx(cats('VLIST',_n_),catx(' ',of col:));
run;
%put _global_;
我可以找到关于如何在 SAS 中随机 select 观察的各种信息,这是一项相当容易的任务。这不是我需要的。我需要随机 select 个变量。我特别想做的是从我的 159 个变量列表中随机选择 20 个变量,然后重复 50 次。我也想确保多样性。我已经在这上面花了大约两天时间了,但没有运气。
很高兴您提出这个问题,因为我刚刚为此开发了一个解决方案!让我们一步一步地详细说明需要做什么。
第0步:我们需要做什么?
我们需要一种方法来获取所有变量并随机获取其中的 select 20 个,同时将它们保持在 SAS 语言规则的范围内。
我们需要:
- 数据集中的所有变量
- 一种随机重新排序的方法
- 限制为 20 个变量
- 循环 50 次的方法
让我们从 1 开始。
第 1 步:获取所有变量
sashelp.vcolumn
提供数据集中所有变量的列表。让我们 select 他们全部。
proc sql noprint;
create table all_vars as
select name
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
;
quit;
这为我们提供了数据集中所有变量的列表。现在,我们需要对它们进行随机排序。
第 2 步:使它们随机化
SAS 提供了 rand
函数,允许您从任何您喜欢的分布中提取。您可以在 rand
函数之前使用 call streaminit(seedhere)
来设置特定的种子,从而创建可重现的结果。
我们将简单地修改我们原来的 SQL 语句并使用 rand()
函数对数据集进行排序。
data _null_;
call streaminit(1234);
run;
proc sql noprint;
create table all_vars as
select name
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform');
quit;
现在我们所有的变量都是随机排列的,按 uniform
分布均匀分布。
第 3 步:限制为 20 个变量
您可以通过几种方式做到这一点。一种方法是单独过程中的 obs=
数据集选项,另一种方法是 outobs=
proc sql
选项。就个人而言,我喜欢 obs=
数据集选项,因为它不会在日志中生成警告,并且可以在其他过程中使用。
data _null_;
call streaminit(1234);
run;
proc sql noprint outobs=20;
create table all_vars as
select name
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform');
quit;
第 4 步:循环 50 次
我们将使用 SAS 宏语言来完成这一部分。我们可以通过这种方式创建 50 个单独的数据集,或者稍微切换代码并将它们读入宏变量。
%macro selectVars(loop=50, seed=1234);
data _null_;
call streaminit(&seed);
run;
%do i = 1 %to &loop;
proc sql noprint outobs=20;
create table all_vars&i as
select name
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform')
;
quit;
%end;
%mend;
%selectVars;
或者,选项 2:
%macro selectVars(loop=50, seed=1234);
data _null_;
call streaminit(&seed);
run;
%do i = 1 %to &loop;
proc sql noprint outobs=20;
select name
into :varlist separated by ' '
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform')
;
quit;
%end;
%mend;
%selectVars;
第二个选项将创建一个名为 &varlist
的局部宏变量,其中随机 20 个变量由空格分隔。这对于各种建模过程来说很方便,并且更可取,因为它不会每次都创建一个单独的数据集。
希望对您有所帮助!
您需要将元数据视为数据并使用 SURVEYSELECT 进行 select 观察。然后也许将这些名称放入宏变量但您没有提到您想要的确切输出。
data v;
array rvars[159];
run;
proc transpose data=v(obs=0) out=vars name=name;
var rvars:;
run;
proc surveyselect reps=4 sampsize=20 data=vars out=selection;
run;
proc transpose data=selection out=lists(drop=_:);
by replicate;
var name;
run;
proc print;
run;
data _null_;
set lists;
by replicate;
call symputx(cats('VLIST',_n_),catx(' ',of col:));
run;
%put _global_;