Как удалить переменные с огромным процентом отсутствующих в таблице в SAS?

У меня есть таблица в SAS с отсутствующими значениями, как показано ниже:

col1 | col2 | col3 | ... | coln
-----|------|------|-----|-------
111  |      | abc  | ... | abc
222  | 11   | C1   | ... | 11
333  | 18   |      | ... | 12
...  | ...  | ...  | ... | ...

И мне нужно удалить из приведенных выше переменных таблицы, где более 80% отсутствующих значений (> = 80%).

Как я могу сделать это в SAS?

Посмотрите этот ответ от Reeza: community.sas.com/t5/SAS-Programming/…

Stu Sztukowski 02.12.2022 00:56

Stu Sztukowski Я видел этот пост, но у меня он не работает, я не знаю почему, но он генерирует только 1 строку на выходе, может быть, у вас есть другое решение? :)

dingaro 02.12.2022 01:04

Все ли переменные, которые вы хотите удалить, числовые? Или вам также нужно проверить некоторые строки символов?

Tom 02.12.2022 02:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 ... утверждение.

whymath 02.12.2022 08:27

Другие вопросы по теме