У меня есть таблица в SAS с отсутствующими значениями, как показано ниже:
col1 | col2 | col3 | ... | coln
-----|------|------|-----|-------
111 | | abc | ... | abc
222 | 11 | C1 | ... | 11
333 | 18 | | ... | 12
... | ... | ... | ... | ...
И мне нужно удалить из приведенных выше переменных таблицы, где более 80% отсутствующих значений (> = 80%).
Как я могу сделать это в SAS?
Stu Sztukowski Я видел этот пост, но у меня он не работает, я не знаю почему, но он генерирует только 1 строку на выходе, может быть, у вас есть другое решение? :)
Все ли переменные, которые вы хотите удалить, числовые? Или вам также нужно проверить некоторые строки символов?
Приведенный ниже макрос создаст переменную макроса с именем &drop_vars
, которая содержит список переменных, которые нужно удалить из вашего набора данных, которые превышают отсутствующий порог. Это работает как для символьных, так и для числовых переменных. Если у вас их много, то этот макрос не сработает, но его можно легко изменить для обработки любого количества переменных. Вы можете сохранить и повторно использовать этот макрос.
%macro get_missing_vars(lib=, dsn=, threshold=);
%global drop_vars;
/* Generate a select statement that calculates the proportion missing:
nmiss(var1)/count(*) as var1, nmiss(var2)/count(*) as var2, ... */
proc sql noprint;
select cat('nmiss(', strip(name), ')/count(*) as ', strip(name) )
into :calculate_pct_missing separated by ','
from dictionary.columns
where libname = upcase("&lib")
AND memname = upcase("&dsn")
;
quit;
/* Calculate the percent missing */
proc sql;
create table pct_missing as
select &calculate_pct_missing.
from &lib..&dsn.
;
quit;
/* Convert to a long table */
proc transpose data=pct_missing out=drop_list;
var _NUMERIC_;
run;
/* Get a list of variables to drop that are >= the drop threshold */
proc sql noprint;
select _NAME_
into :drop_vars separated by ' '
from drop_list
where COL1 GE &threshold.
;
quit;
%mend;
Он имеет три параметра:
lib
: библиотека вашего набора данных
dsn
: Имя набора данных без библиотеки.
threshold
: доля отсутствующих значений, которая должна соответствовать или превышать переменную, чтобы быть отброшенной.
Например, давайте создадим некоторые образцы данных и воспользуемся ими. col1 col2 col3
все имеют 80% пропущенных значений.
data have;
array col[10];
do i = 1 to 10;
do j = 1 to 10;
col[j] = i;
if (i > 2 AND j in(1, 2, 3) ) then col[j] = .;
end;
output;
end;
drop i j;
run;
Запустим макрос и проверим лог:
%get_missing_vars(lib=work, dsn=have, threshold=0.8);
%put &drop_vars;
Журнал показывает:
col1 col2 col3
Теперь мы можем передать это в простой шаг данных.
data want;
set have;
drop &drop_vars;
run;
Хорошая работа! Я также предлагаю использовать %if %str(&drop_vars) %then %do; ...; %end;
, чтобы окружить drop ...
утверждение.
Посмотрите этот ответ от Reeza: community.sas.com/t5/SAS-Programming/…