从单个sas单元格中提取观察列表

时间:2016-02-11 00:49:25

标签: sas

我有一个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循环来遍历每个管道,但这似乎是不必要的复杂。有关更优雅解决方案的建议吗?

1 个答案:

答案 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 ;