【问题标题】:SAS concatenate in SAS Data StepSAS 数据步骤中的 SAS 连接
【发布时间】:2018-04-26 20:57:57
【问题描述】:

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

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 到任意数字。

有人可以帮我吗?

【问题讨论】:

标签: sas


【解决方案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"

【讨论】:

  • 你运行过这个吗?它没有给出预期的输出。还包含日志中的警告并包含无关代码。
  • @robert 你是对的,这是错误的。现在纠正它。谢谢指正
【解决方案2】:

您可以使用按组处理和保留功能来实现这一点。

创建示例数据集:

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 语句告诉数据步将值保持在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多