我有一个sas数据集,它有一个嵌入在单个字符变量中的变量列表,由管道分隔。它看起来像这样:
OB的。 List_of_forms
1, “| FORMA(2003年4月15日)|| FormB(2004年4月15日)|”, 2, “| FORMA(2002年4月15日)|| FORMA(2003年4月15日)|| FormB(2003年4月15日)|”
我想将管道分隔的每个项目提取为单个变量,因此数据看起来像这样:
Obs。,form1,form2,form3
1, “FORMA(2003年4月15日)”, “FormB(2004年4月15日)”,。, 2, “FORMA(2002年4月15日)”, “FORMA(2003年4月15日)”, “FormB(2003年4月15日)”
但我对如何做到这一点感到茫然。我已经考虑过编写一个do循环来遍历每个管道,但这似乎是不必要的复杂。有关更优雅解决方案的建议吗?
答案 0 :(得分:1)
使用SCAN()
功能。首先,我们可以设置您的示例数据。
data have ;
obs+1;
input list_of_forms $60. ;
cards;
|FormA(04-15-2003)||FormB(04-15-2004)|
|FormA(04-15-2002)||FormA(04-15-2003)||FormB(04-15-2003)|
;;;;
现在我们可以将它转换为多列。
data want;
set have ;
array form (3) $60 ;
do i=1 to dim(form);
form(i) = scan(list_of_forms,i,'|');
end;
drop i;
run;
为了使其更具动态性,您可以在整个数据集中找到最大值,并在新变量上替换硬编码的上限3。
proc sql noprint ;
select max(countw(list_of_forms,'|'))
into :nforms
from have
;
run;
...
array form (&nforms) $60 ;