从单个sas单元提取观察列表
我有一个sas数据集,它有一个嵌入在单个字符变量中的变量列表,由管道分隔。它看起来像这样: Obs。表格列表 1、“|表格(04-15-2003)|表格B(04-15-2004)|”, 2、“|形式(04-15-2002)|形式(04-15-2003)|形式B(04-15-2003)|” 我想将管道分隔的每个项提取为单独的变量,因此数据如下所示: 表一、表二、表三 1,“表格(04-15-2003)”,“表格B(04-15-2004)”,。, 2,“表格(04-15-2002)”、“表格(04-15-2003)”、“表格B(04-15-2003)” 但我不知道该怎么做。我曾考虑过编写一个do循环来迭代每个管道,但这似乎不必要地复杂。关于更优雅的解决方案有什么建议吗?使用从单个sas单元提取观察列表,sas,Sas,我有一个sas数据集,它有一个嵌入在单个字符变量中的变量列表,由管道分隔。它看起来像这样: Obs。表格列表 1、“|表格(04-15-2003)|表格B(04-15-2004)|”, 2、“|形式(04-15-2002)|形式(04-15-2003)|形式B(04-15-2003)|” 我想将管道分隔的每个项提取为单独的变量,因此数据如下所示: 表一、表二、表三 1,“表格(04-15-2003)”,“表格B(04-15-2004)”,。, 2,“表格(04-15-2002)”、“表格(04-
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 ;
欢迎来到SO!如果汤姆的回答对你有帮助,你一定要投赞成票。如果它解决了你的问题,别忘了将他的答案标记为被接受的答案(投票按钮旁边会有一个复选标记,按下它,当被接受为答案时,它将变为绿色)。工作非常出色。谢谢