将同一数据集中的多个变量附加到单个变量中

时间:2015-01-26 12:20:23

标签: sas

给出以下数据集:。

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;

4 个答案:

答案 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;
相关问题