SAS:如何将定界和拆分列替换为多行?
SAS: How to replace delimit and split column to multiple rows?
我刚开始学习 SAS 编程,我正在尝试用“|”替换短语“@@@@”在 SAS Studio 中将单元格拆分为多行之前。
我在下面为这个实验创建了一个例子。它是 How to split a column into multiple rows in SAS 的参考,但我无法让它工作。 SYSTEM_ID 列打印良好,但 ITEM_LIST 未拆分。
我目前的输出如下:
这是我当前的代码。请帮忙。
data example1;
input SYSTEM_ID $ ITEM_LIST $ 5-50 ;
datalines;
ID_1 Apple Juice @@@@ Orange @@@@ Banana Milk
;
run;
data example2 (keep=SYSTEM_ID ITEM_LIST_SUB rename=(ITEM_LIST_SUB=ITEM_LIST));
set example1;
ITEM_LIST_TRANS = tranwrd(ITEM_LIST,"@@@@","|");
do i = 1 to countw(ITEM_LIST_TRANS,"|");
ITEM_LIST_SUB = scan(ITEM_LIST,i,"|");
output;
end;
run;
proc print data = example2;run;
你的解决方案有两个小问题:-)
- 您在扫描函数中引用了 ITEM_LIST 而不是 ITEM_LIST_TRANS
- 在您的示例数据中,您的数据是缩进的,因此 ID_1 成为 ITEM_LIST 的一部分。
看看这是否适合你
data example1;
input SYSTEM_ID $ ITEM_LIST $ 5-50 ;
datalines;
ID_1 Apple Juice @@@@ Orange @@@@ Banana Milk
;
run;
data example2 (keep=SYSTEM_ID ITEM_LIST_SUB rename=(ITEM_LIST_SUB=ITEM_LIST));
set example1;
ITEM_LIST_TRANS = tranwrd(ITEM_LIST,"@@@@","|");
do i = 1 to countw(ITEM_LIST_TRANS,"|");
ITEM_LIST_SUB = scan(ITEM_LIST_TRANS,i,"|");
output;
end;
run;
proc print data = example2;run;
结果:
Obs SYSTEM_ID ITEM_LIST
1 ID_1 Apple Juice
2 ID_1 Orange
3 ID_1 Banana Milk
DLMSTR 将允许直接读取。
data example1;
infile cards dlmstr='@@@@' missover;
input SYSTEM_ID $ @;
length item ;
do until(missing(item));
input item @;
if not missing(item) then output;
end;
datalines;
ID_1 Apple Juice @@@@ Orange @@@@ Banana Milk
ID_2 Apple Juice @@@@ Orange @@@@ Banana Milk @@@@ Apple Juice @@@@ Orange @@@@ Banana Milk
;
run;
proc print;
run;
我刚开始学习 SAS 编程,我正在尝试用“|”替换短语“@@@@”在 SAS Studio 中将单元格拆分为多行之前。
我在下面为这个实验创建了一个例子。它是 How to split a column into multiple rows in SAS 的参考,但我无法让它工作。 SYSTEM_ID 列打印良好,但 ITEM_LIST 未拆分。
我目前的输出如下:
这是我当前的代码。请帮忙。
data example1;
input SYSTEM_ID $ ITEM_LIST $ 5-50 ;
datalines;
ID_1 Apple Juice @@@@ Orange @@@@ Banana Milk
;
run;
data example2 (keep=SYSTEM_ID ITEM_LIST_SUB rename=(ITEM_LIST_SUB=ITEM_LIST));
set example1;
ITEM_LIST_TRANS = tranwrd(ITEM_LIST,"@@@@","|");
do i = 1 to countw(ITEM_LIST_TRANS,"|");
ITEM_LIST_SUB = scan(ITEM_LIST,i,"|");
output;
end;
run;
proc print data = example2;run;
你的解决方案有两个小问题:-)
- 您在扫描函数中引用了 ITEM_LIST 而不是 ITEM_LIST_TRANS
- 在您的示例数据中,您的数据是缩进的,因此 ID_1 成为 ITEM_LIST 的一部分。
看看这是否适合你
data example1;
input SYSTEM_ID $ ITEM_LIST $ 5-50 ;
datalines;
ID_1 Apple Juice @@@@ Orange @@@@ Banana Milk
;
run;
data example2 (keep=SYSTEM_ID ITEM_LIST_SUB rename=(ITEM_LIST_SUB=ITEM_LIST));
set example1;
ITEM_LIST_TRANS = tranwrd(ITEM_LIST,"@@@@","|");
do i = 1 to countw(ITEM_LIST_TRANS,"|");
ITEM_LIST_SUB = scan(ITEM_LIST_TRANS,i,"|");
output;
end;
run;
proc print data = example2;run;
结果:
Obs SYSTEM_ID ITEM_LIST
1 ID_1 Apple Juice
2 ID_1 Orange
3 ID_1 Banana Milk
DLMSTR 将允许直接读取。
data example1;
infile cards dlmstr='@@@@' missover;
input SYSTEM_ID $ @;
length item ;
do until(missing(item));
input item @;
if not missing(item) then output;
end;
datalines;
ID_1 Apple Juice @@@@ Orange @@@@ Banana Milk
ID_2 Apple Juice @@@@ Orange @@@@ Banana Milk @@@@ Apple Juice @@@@ Orange @@@@ Banana Milk
;
run;
proc print;
run;