2015-12-14 5 views
0

У меня есть набор данных, который выглядит следующим образом:объединить две колонки в две другие колонки?

weight |  malf 
3.18456   0 
4.2433   1 
3.8543   0 
4.
4.15    1 

Мне нужно изменить это:

Type |  respons 
weight   3.18456 
malf   0 
weight   4.2433 
malf   1 
weight   3.8543 
malf   0 
weight   4.
malf   1 
weight   4.15 
malf   1 

Так что мой набор данных будет двойной, как большой.
Если вы пробовали какое-то время, но я не нашел способ. Есть ли способ сделать это?

ответ

2

Вот общее решение, которое должно работать на вас. Он помещает все ваши числовые переменные в массив. Для каждого наблюдения, он перебирает все свои числовые переменные в порядке и делает следующий порядок операций:

  1. Читает переменную я «s имя хранится в массиве, и выплевывает переменной типа ,

  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; 
    
0

Это код специально для работы с входами. Первый шаг данных воссоздает ваши данные. Второе выдает то, что вам нужно. Я предполагаю, что «вдвое больше» вы подразумеваете в два раза больше наблюдений.

/*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.;  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; 
0

Это решение действительно даже с не численной переменной.

    - Вначале хранятся все имена переменных в наборе данных с СОДЕРЖАНИЕМ ПРОЦЕССА.
    - Затем он создает переменную макроса для каждого столбца.
    - И наконец, он создает выходной набор данных: для каждой строки ввода он возвращает 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 
Смежные вопросы