使用SAS拆分字符串并创建变量

使用SAS拆分字符串并创建变量,sas,Sas,我有一个字符串28,16OB4N7L8O4L,使用两个数组,我将它们拆分为单独的变量 hrs1 hrs2 hrs3 hrs4 hrs5 hrs6 hrs7 28 16 1 4 7 8 4 cd1 cd2 cd3 cd4 cd5 cd6 cd7 , O B N L O L 现在我想总结一下变量,如果在上面的示例中字符变量中重复相同的值,'O'和'L'重复,那么我想合并为一个,并添加相应的hr 输出应为:

我有一个字符串
28,16OB4N7L8O4L
,使用两个数组,我将它们拆分为单独的变量

hrs1 hrs2 hrs3 hrs4 hrs5 hrs6 hrs7    
28   16   1     4   7    8    4

cd1  cd2  cd3  cd4  cd5  cd6  cd7

,    O    B    N    L    O    L
现在我想总结一下变量,如果在上面的示例中字符变量中重复相同的值,
'O'
'L'
重复,那么我想合并为一个,并添加相应的hr

输出应为:

,  O  B  N  L       -COLUMN  
28 24 1  4  11      -VALUES

下面是一个转换为规范化(长瘦格式)的示例。我添加了第二个示例记录

data have;
  input id hrs1-hrs7 (cd1-cd7) ($1.);
  cards;
1 28 16 1 4 7 8 4 ,OBNLOL
2 1  2  3 4 5 6 7 AAAABBB
;
run;

data tran (keep=id hr cd) / view=tran ;
  set have ;
  array hrs{*} hrs1-hrs7 ;
  array cds{*} cd1-cd7 ;
  do i=1 to dim(hrs) ;
    hr=hrs{i} ;
    cd=cds{i} ;
    output ;
  end ;
run ;

proc sql ;
  select id, cd, sum(hr)
  from tran
  group by id, cd
  ;
quit ;
返回:

id  cd
________________
 1  ,         28
 1  B          1
 1  L         11
 1  N          4
 1  O         24
 2  A         10
 2  B         18

下面是一个转换为规范化(长瘦格式)的示例。我添加了第二个示例记录

data have;
  input id hrs1-hrs7 (cd1-cd7) ($1.);
  cards;
1 28 16 1 4 7 8 4 ,OBNLOL
2 1  2  3 4 5 6 7 AAAABBB
;
run;

data tran (keep=id hr cd) / view=tran ;
  set have ;
  array hrs{*} hrs1-hrs7 ;
  array cds{*} cd1-cd7 ;
  do i=1 to dim(hrs) ;
    hr=hrs{i} ;
    cd=cds{i} ;
    output ;
  end ;
run ;

proc sql ;
  select id, cd, sum(hr)
  from tran
  group by id, cd
  ;
quit ;
返回:

id  cd
________________
 1  ,         28
 1  B          1
 1  L         11
 1  N          4
 1  O         24
 2  A         10
 2  B         18

下面是一个转换为规范化(长瘦格式)的示例。我添加了第二个示例记录

data have;
  input id hrs1-hrs7 (cd1-cd7) ($1.);
  cards;
1 28 16 1 4 7 8 4 ,OBNLOL
2 1  2  3 4 5 6 7 AAAABBB
;
run;

data tran (keep=id hr cd) / view=tran ;
  set have ;
  array hrs{*} hrs1-hrs7 ;
  array cds{*} cd1-cd7 ;
  do i=1 to dim(hrs) ;
    hr=hrs{i} ;
    cd=cds{i} ;
    output ;
  end ;
run ;

proc sql ;
  select id, cd, sum(hr)
  from tran
  group by id, cd
  ;
quit ;
返回:

id  cd
________________
 1  ,         28
 1  B          1
 1  L         11
 1  N          4
 1  O         24
 2  A         10
 2  B         18

下面是一个转换为规范化(长瘦格式)的示例。我添加了第二个示例记录

data have;
  input id hrs1-hrs7 (cd1-cd7) ($1.);
  cards;
1 28 16 1 4 7 8 4 ,OBNLOL
2 1  2  3 4 5 6 7 AAAABBB
;
run;

data tran (keep=id hr cd) / view=tran ;
  set have ;
  array hrs{*} hrs1-hrs7 ;
  array cds{*} cd1-cd7 ;
  do i=1 to dim(hrs) ;
    hr=hrs{i} ;
    cd=cds{i} ;
    output ;
  end ;
run ;

proc sql ;
  select id, cd, sum(hr)
  from tran
  group by id, cd
  ;
quit ;
返回:

id  cd
________________
 1  ,         28
 1  B          1
 1  L         11
 1  N          4
 1  O         24
 2  A         10
 2  B         18

您会接受一种转置数据的解决方案吗?也就是说,不是从14个变量(hrs1-hrs7和cd1-cd7)开始,而是将其转换为两个变量,hrs和cd。在这种结构中,按cd分组和每个组中的hr之和是直接进行的。如何从原始字符串中得到hrs3=1?当有两个连续字符时,我插入1。您是否接受转置数据的解决方案?也就是说,不是从14个变量(hrs1-hrs7和cd1-cd7)开始,而是将其转换为两个变量,hrs和cd。在这种结构中,按cd分组和每个组中的hr之和是直接进行的。如何从原始字符串中得到hrs3=1?当有两个连续字符时,我插入1。您是否接受转置数据的解决方案?也就是说,不是从14个变量(hrs1-hrs7和cd1-cd7)开始,而是将其转换为两个变量,hrs和cd。在这种结构中,按cd分组和每个组中的hr之和是直接进行的。如何从原始字符串中得到hrs3=1?当有两个连续字符时,我插入1。您是否接受转置数据的解决方案?也就是说,不是从14个变量(hrs1-hrs7和cd1-cd7)开始,而是将其转换为两个变量,hrs和cd。在这种结构中,按cd分组和每个组中的hr之和是直接进行的。如何从原始字符串中得到hrs3=1?当有两个连续字符时,我插入1。