2016-12-20 6 views
0

Предположим, у меня есть 10 переменных, все с одним и тем же префиксом (они начинаются с com).sas: перекодировать кучу переменных сразу

Предположим, что переменные являются бинарными, и есть некоторые отсутствующие данные, и я хотел бы установить все эти отсутствующие данные в 0. Я хотел бы создать новую переменную для каждой исходной переменной, чтобы исходные данные были неповрежденными.

Как бы я переписал все эти переменные сразу? Есть ли простой способ запустить цикл в SAS? Если бы это был Python или R, я мог бы написать цикл, чтобы сделать все это с помощью grep или чего-то подобного.

EDIT: Вот что я пытаюсь сделать. Я хочу использовать unindexed массив с переменными com для создания их копий с именем new_com (префикс каждой переменной new). Затем я просто хочу перекодировать, что, как я знаю, я могу сделать с помощью операторов ifthen. Первая часть, о клонировании переменных, - это то место, где я застрял.

+0

Вы можете определить каждую новую переменную с помощью оператора if, например , если com1 =. то com1_nm = 0; else com1_nm = com1; или, поскольку это будет довольно повторяющимся, вы можете использовать do loops и массивы, чтобы сэкономить вам столько кода. http://support.sas.com/resources/papers/proceedings10/158-2010.pdf –

+0

Спасибо, это полезно, но есть две проблемы: мне нужно переименовать переменные, используя префикс, d скорее не нужно перечислять каждый отдельно в массиве, а скорее использовать какой-либо шаблон. Любое понимание того, как это сделать? – vashts85

ответ

1

Ниже редактируется в случае, если вы не знаете, сколько переменных у вас есть, но вы знаете префикс вы хотите:

data test; 
    input coma comet compton communism come comb community comerade complete comma; 
    datalines; 
    1 1 1 0 0 . 0 0 1 . 
    ; 
run; 

%let prefix=com; 

/* output the list of variables and only keep those with prefix */ 
proc contents data = test noprint out=names(keep=name varnum); run; 

proc sort data = names; 
    by varnum; 
run; 

/* create your new variable with a "new_" prefix */ 
data names1; set names; 
    if index(name,"&prefix."); 
    new_name = "new_"||strip(name); 
run; 

/* put lists into macro variables */ 
proc sql noprint; 
    select name 
    into: old_vars separated by " " 
    from names1; 

    select new_name 
    into: new_vars separated by " " 
    from names1; 

    select count(*) 
    into: nobs 
    from names1; 
quit; 

%put &old_vars.; 
%put &new_vars.; 
%put &nobs.; 

/* use array and macro variables to manipulate data */ 
data test1; set test; 
    array old(&nobs.) &old_vars.; 
    array new(&nobs.) &new_vars.; 
     do i=1 to &nobs.; 
      if old(i) = . then new(i) = 0; 
       else new(i) = old(i); 
     end; 
    drop i; 
run; 
+0

Что делать, если я этого не делаю? Есть ли способ сказать SAS, чтобы найти длину «старой»? – vashts85

+0

Я отредактировал этот код, чтобы это отразить. Все, что вам нужно знать, это ваш префикс, и вы должны быть установлены. – Foxer

1

Предполагая, что вы SAS/STAT лицензии, это проще всего сделать с помощью PROC STDIZE:

data have; 
    array com[10]; 
    call streaminit(7); 
    do _j = 1 to 10; 
    do _i = 1 to 10; 
     if rand('Uniform') < 0.2 the com[_i]=.; 
     else com[_i]=1; 
    end; 
    output; 
    end; 
run; 

proc stdize data=have out=have_zero missing=0 reponly sprefix=new_ oprefix=old_; 
    var com:; 
run; 

reponly говорит не делать каких-либо стандартизации (только приписывать ноль для отсутствующих), sprefix и oprefix указать, что префикс унифицированные и оригинальные переменные.

+1

И если вы хотите, чтобы исходные переменные сохраняли свои имена, используйте OPREFIX без опции префикса. –

+0

Редактировать: Хм, это не сработало в первый раз, когда я это сделал, но теперь это происходит ... – Joe