给出以下数据集:。
obs var1 var2 var3
1 123 456 .
2 123 . 789
3 . 456 789
如何将所有变量附加到单个变量中,同时忽略空的观察结果(用“。”表示)?
期望的输出:。
obs var4
1 123
2 123
3 456
4 456
5 789
6 789
数据步骤:。
data have;
input
var1 var2 var3; cards;
123 456 .
123 . 789
. 456 789
;run;
答案 0 :(得分:0)
不确定为什么你在char中读取数字,但如果我改为num,可以这样做:
data have;
input var1 var2 var3;
cards;
123 456 .
123 . 789
. 456 789
;run;
data want (keep=var4);
set have;
var4=var1;if var4 ne . then output;
var4=var2;if var4 ne . then output;
var4=var3;if var4 ne . then output;
run;
答案 1 :(得分:0)
好的,我们假设您有一个文件与其中的值相关,并且您不知道每行中有多少变量。首先,我需要创建一个示例文本文件:
filename x temp;
data _nulL_;
file x;
put "123 456 . ";
put "123 . 789 ";
put ". 456 789 ";
run;
然后我需要读取第一行并计算变量的数量:
data _null_;
infile x;
input;
call symputx("number_of_variables",put(countw(_infile_," ","c"),best.));
stop;
run;
%put &number_of_variables;
现在我可以动态读取变量:
%macro doit();
data have;
infile x;
input
%do i=1 %to &number_of_variables;
var&i
%end;
;
run;
data want (keep=var%eval(&number_of_variables + 1));
set have;
%do i=1 %to &number_of_variables;
var%eval(&number_of_variables + 1)=var&i;
if var%eval(&number_of_variables + 1) ne . then output;
%end;
run;
%mend;
%doit;
答案 2 :(得分:0)
您可以使用proc transpose
执行此操作,但这样做有一个技巧。在进行转置之前,您需要为每一行添加唯一标识符。
我采用了@ Stig的样本数据并添加了观察号作为唯一标识符:
data have;
input var1 var2 var3;
x = _n_; * ADDING A UNIQUE IDENTIFIER TO EVERY ROW;
cards;
123 456 .
123 . 789
. 456 789
;run;
然后它只是一个运行proc转置的案例:
proc transpose data=have out=xx;
by x;
run;
最后,删除缺少col1的任何结果,并添加观察编号:
data want;
obs = _n_;
set xx (keep=col1);
where col1 ne .;
run;
答案 3 :(得分:0)
由于订单并不重要,您可以使用数组一步完成。当数据步骤遍历每一行时,该数组使变量值可以存储在内存中,因此您可以遍历它们。我已将其设置为每次找到非缺失值,然后将其输出到新变量。
在创建数组时,我将其设置为var1 - var3,双短划线表示var1和var3之间的所有变量。如果实数变量的编号方式相同,则可以使用var1-var3,这意味着两个变量之间的所有序号。
data have;
input var1 var2 var3;
datalines;
123 456 .
123 . 789
. 456 789
;
run;
data want;
set have;
array allnums var1--var3;
do i = 1 to dim(allnums);
if not missing(allnums{i}) then do;
var4 = allnums{i};
output;
end;
end;
drop var1--var3 i;
run;