2016-12-05 13 views
1

Я хочу удалить столбцы в наборе данных SAS, который имеет сумму меньше определенного значения. Рассмотрим пример ниже.Удаление переменной на основе суммы значений в ней с использованием SAS

Column_A Pred_1 Pred_2 Pred_3 Pred_4 Pred_5 
A    1  1  0  1  0 
A    0  1  0  1  0 
A    0  1  0  1  0 
A    0  1  0  1  1 
A    0  1  0  0  1 

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

Column_A Pred_2 Pred_4 
A    1  1 
A    1  1 
A    1  1 
A    1  1 
A    1  0 

В настоящее время я использую очень неэффективный метод использования множественных транспозиций для снижения предикторов. Существует несколько наборов данных с записями> 30 000, поэтому подход транспонирования требует времени. Если бы у кого-то было более эффективное решение!

Спасибо!

ответ

0

Похоже, вы могли бы сделать:

  1. Run PROC MEANS или аналогичный прок, чтобы получить суммы
  2. Создать макропеременную, который содержит все переменные в наборе данных с суммой < порогу
  3. Отбросьте эти переменные

Тогда нет TRANSPOSE или что-то еще, просто регулярное обычное старое обобщение и капли. Обратите внимание, что вы должны использовать ODS OUTPUT не OUT= в PROC MEANS, иначе вам нужно будет PROC TRANSPOSE нормальный PROC MEANSOUT= dataset.

Пример использования тривиальный набор данных:

data have; 
    array x[20]; 
    do _n_ = 1 to 20; 
    do _i = 1 to dim(x); 
     x[_i] = rand('Uniform') < 0.2; 
    end; 
    output; 
    end; 
run; 

ods output summary=have_sums; *how we get our output; 
ods html select none;   *stop it from going to results window; 
proc means data=have stackodsoutput sum; *stackodsoutput is 9.3+ I believe; 
    var x1-x20; 
run; 
ods html select all;   *reenable normal html output; 

%let threshhold=4;    *your threshhold value; 

proc sql; 
    select variable 
    into :droplist_threshhold separated by ' ' 
    from have_sums 
    where sum lt &threshhold; *checking if sum is over threshhold; 
quit; 

data want; 
    set have; 
    drop &droplist_threshhold.; *and now, drop them!; 
run; 
+0

Спасибо за этот комментарий. Я запускал это на EG, и я получаю эту ошибку, когда запускаю средства proc. ОШИБКА: адрес HTML не активен; нет доступных списков выбора/исключения. Мысли? –

+0

Вы можете удалить 'oss html – Joe

+0

Вы можете удалить строки' ODS HTML'. Они предназначены только для уменьшения вывода на экран. – Joe

0

PROC SUMMARY Просто используйте, чтобы получить суммы. Затем вы можете использовать шаг данных, чтобы сгенерировать список имен переменных, которые нужно удалить.

%let threshhold=4; 
%let varlist= pred_1 - pred_5; 

proc summary data=have ; 
    var &varlist ; 
    output out=sum sum= ; 
run; 

data _null_; 
    set sum ; 
    array x &varlist ; 
    length droplist $500 ; 
    do i=1 to dim(x); 
    if x(i) < &threshhold then droplist=catx(' ',droplist,vname(x(i))); 
    end; 
    call symputx('droplist',droplist); 
run; 

Вы можете использовать макропеременную для создания DROP заявления или опцион DROP= набора данных.

drop &droplist;