我不知道如何描述这个问题,但这是一个例子。我有一个初始数据集,如下所示:
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到任何数字。
有人可以帮助我吗?
答案 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