SAS - 使用另一列的值动态创建列名 [英] SAS - Dynamically create column names using the values from another column
问题描述
我有一列包含许多从 XML 解析器解析的标志.数据如下所示:
I Have a column with many flags that were parsed from a XML parser. Data looks like this:
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N;
我必须创建一个包含所有这些列名的表来捕获标志.喜欢:
I have to create a table with all these column names to capture the flags. Like:
USERKEYED VALMATCH DEVICEVERIFIED EXCEPTION USERREGISTRD ASSOCIATE EXTERNAL GROSSGIVEN UMAPPED
Y N N N N Y N Y N
Y N N N N Y Y Y N
Y N N Y N Y N Y N
如何在 SAS 中动态捕获值?在 DATA 步还是在 PROC 步中?
How can I capture values dynamically in SAS? Either in a DATA step or a PROC step?
提前致谢.
推荐答案
让我们从你的示例输出数据开始.
Let's start with your example output data.
data expect ;
id+1;
length USERKEYED VALMATCH DEVICEVERIFIED EXCEPTION
USERREGISTRD ASSOCIATE EXTERNAL GROSSGIVEN UMAPPED $1 ;
input USERKEYED -- UMAPPED;
cards4;
Y N N N N Y N Y N
Y N N N N Y Y Y N
Y N N Y N Y N Y N
;;;;
现在我们可以重新创建您的示例输入数据:
Now we can recreate your example input data:
data have ;
do until (last.id);
set expect ;
by id ;
array flag _character_;
length string $200 ;
do _n_=1 to dim(flag);
string=catx(';',string,catx('=',vname(flag(_n_)),flag(_n_)));
end;
end;
keep id string;
run;
看起来像这样:
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=Y;GROSSGIVEN=Y;UMAPPED=N
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=Y;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N
因此,为了处理这个问题,我们需要将变量 STRING
中的对解析为多个观察值,并将各个对的值拆分为 NAME
和 VALUE
变量.
So to process this we need to parse out the pairs from the variable STRING
into multiple observations with the individual pairs' values split into NAME
and VALUE
variables.
data middle ;
set have ;
do _n_=1 by 1 while(_n_=1 or scan(string,_n_,';')^=' ');
length name $32 ;
name = scan(scan(string,_n_,';'),1,'=');
value = scan(scan(string,_n_,';'),2,'=');
output;
end;
keep id name value ;
run;
然后我们可以使用 PROC TRANSPOSE
将这些观察结果转换为变量.
Then we can use PROC TRANSPOSE
to convert those observations into variables.
proc transpose data=middle out=want (drop=_name_) ;
by id;
id name ;
var value ;
run;
这篇关于SAS - 使用另一列的值动态创建列名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!