SAS在SAS Data Step中连接

时间:2018-04-26 20:57:58

标签: sas

我不知道如何描述这个问题,但这是一个例子。我有一个初始数据集,如下所示:

input  first second $3.;
cards;
1 A
1 B
1 C
1 D
2 E
2 F
3 S
3 A
4 C
5 Y
6 II
6 UU
6 OO
6 N
7 G
7 H
...
;

我想要一个像这样的输出数据集:

input  first second $;
cards;
1 "A,B,C,D"
2 "E,F"
3 "S,A"
4 "C"
5 "Y"
6 "II,UU,OO,N"
7 "G,H"
...
;

两个表都有两列。列的范围的唯一值"第一"可以是1到任何数字。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

如下所示

 proc sort data=have;
 by first second;
 run;
data want(rename=(b=second));
 length new_second $50.;
do until(last.first);
set have;
by first second ;
new_second =catx(',', new_second, second);
b=quote(strip(new_second));
end;
drop second new_second;
run;

输出

 first  second
 1         "A,B,C,D"
 2         "E,F"
 3          "A,S"
 4           "C"
 5          "Y"
 6         "II,N,OO,UU"
 7         "G,H"

答案 1 :(得分:1)

您可以使用分组处理和保留功能来实现此目的。

创建样本数据集:

data have;
input id value $3.;
cards;
1 A
1 B
1 C
1 D
2 E
2 F
3 S
3 A
4 C
5 Y
6 II
6 UU
6 OO
6 N
7 G
7 H
;
run;

首先确保您的数据集按您的id变量排序:

proc sort data=have;
  by id;
run;

然后使用first.last.表示法来识别id变量何时更改或即将更改。 retain语句告诉datastep将值保持在concatenated_value范围内,而不是将其重置为空值。在输出记录之前,使用quote()函数在结果周围应用"个字符。使用cats()函数执行实际连接,并使用,分隔记录。

data want;
  length contatenated_value $500.;
  set have;
  by id;
  retain contatenated_value ;

  if first.id then do;
    contatenated_value = '';
  end;

  contatenated_value = catx(',', contatenated_value, value);

  if last.id then do;
    contatenated_value = quote(cats(contatenated_value));
    output;
  end;

  drop value;
run;

输出:

contatenated_
    value        id

"A,B,C,D"         1
"E,F"             2
"S,A"             3
"C"               4
"Y"               5
"II,UU,OO,N"      6
"G,H"             7