将两列组合成另外两列?

时间:2015-12-14 15:33:05

标签: sas

我有一个如下所示的数据集:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="topStory">
    <div class="photo">
    <a href="somelink"><img src="someimage.jpg" border="0" alt="Photo"></a>
    </div>
    <h2><a href="somelink">Text near to someimage.jpg</a></h2>
    <p>Some extra text.</p>
</div>

我需要将其更改为:

weight    |      malf
3.18456          0
4.2433           1
3.8543           0
4.0123           1
4.15             1

所以我的数据集会增加一倍 如果现在尝试了一段时间,但我找不到方法。 有没有办法做到这一点?

3 个答案:

答案 0 :(得分:2)

这是一个应该适合您的通用解决方案。它将所有数值变量放入数组中。对于每个观察,它按顺序循环遍历所有数值变量,并执行以下操作顺序:

  1. 读取存储在数组中的变量 i 的名称,并将其吐出到变量Type。

  2. 读取变量 i 的值并将其吐出到变量Response。

  3. 输出,然后返回并使用数字变量 i +1执行相同的操作。每次观察都要冲洗并重复。

    data want;
    length Type $10.;
    
        set have;
        array numvars[*] _NUMERIC_;
    
        do i = 1 to dim(numvars);
            Type = vname(numvars[i]);
            Response = numvars[i];
            output;
        end;
    
        keep Type Response;
    run;
    

答案 1 :(得分:0)

这是专门用于输入的代码。第一个数据步骤重新创建数据。第二个输出你需要的东西。我假设通过&#34;加倍大&#34;你的意思是观察的两倍。

/*recreate input file*/
data aa;
     weight  =3.18456; malf=         0;
output;
 weight  =4.2433  ;       malf=  1;
output;
 weight  =3.8543  ;        malf= 0;
output;
 weight  =4.0123  ;       malf=  1;
output;
 weight  =4.15   ;         malf= 1;
  output;
 run;

/*output file*/
data bb;
    set aa;
    type="weight"; respons=weight;
    output;
     type="malf"; respons=malf; 
    output;
run;

答案 2 :(得分:0)

即使使用非数值变量,此解也有效。

    - 它首先将所有变量名称存储在具有PROC CONTENTS的数据集中。
    - 然后它为每列创建一个宏变量。
    - 最后它创建输出数据集:对于每个输入行,它返回N个输出行,其中N是列数。
%macro transpose_like;

/* With this step we save all the column names in the columns_dataset */

proc contents data=start_dataset out=columns_dataset(keep=name) noprint;
run;



/* With the symputx routine we save dinamically the column names to N  macro variables */

data _null_;
    set columns_dataset end=eof;
    call symputx("Var"||strip(_N_),strip(name));
    if eof then
        call symputx("Var_Number",strip(_N_));
run;



/* Finally we write the output_dataset: for every row of start_dataset we output N rows */

data output_dataset(keep=var value);
    length var $ 20 value $20;
    set start_dataset;
    %do i=1 %to &Var_Number.;
        var = "&&Var&i.";
        value = strip(&&Var&i.);
        output;
    %end;
run;

%mend transpose_like;

/* Call the macro */
%transpose_like