2015-09-17 5 views
0

Я не совсем знаком с логикой SAS и не знаю, какие шаги использовать для моей задачи. В основном я хочу рассчитать соотношение между количеством уникальных записей и количеством записей (уникальное отношение), чтобы определить, является ли переменная дискретной или непрерывной. Набор данных содержит 700 + переменных и 5M записей, поэтому использование proc freq, скорее всего, приведет к сбою.SAS перебирает список переменных для подсчета уникальных значений

Вот моя proprosed шаги:

  1. Образец 100000 из набора данных
  2. Рассчитайте 'уникальное соотношение' для каждого столбца в образце

Повторите шаг 1 и шаг 2 для N раз, говорят 50 раз. У нас были бы окончательные данные, например:

Var_name Sample_Number Unique_ratio 
    Var_1  1    0.58 
    ....  .....   ..... 

Затем для каждой переменной вычислите среднее значение по всем N выборкам.

Я могу легко сделать это в python или R. Но это очень больно, чтобы перевести это в SAS. Может ли какой-нибудь эксперт SAS дать мне несколько советов?

+0

Являются ли переменные числовыми или char или микс? – Quentin

+0

Это смесь символов и цифр :) – user2517984

+0

Полезная страница здесь. http://www.sascommunity.org/wiki/Cardinality_Ratio. Интересно, есть ли у вас достаточно памяти для хэш-подхода? Будут ли ваши непрерывные переменные иметь миллионы разных значений или, возможно, только тысячи? – Quentin

ответ

3

Используйте статистику NLEVELS из PROC FREQ. Вот пример с использованием набора данных SASHELP.CLASS, который содержит сочетание числовых и символьных переменных. Обратите внимание, что я использую опцию NOBS для неисполненной инструкции SET, чтобы получить общее количество наблюдений. Если ваш ввод является представлением, вам может потребоваться подсчет количества наблюдений каким-либо другим способом.

proc freq nlevels data=sashelp.class ; 
    ods output nlevels=nlevels; 
    tables _all_/noprint ; 
run; 
data want ; 
    if 0 then set sashelp.class(drop=_all_) nobs=nobs ; 
    set nlevels; 
    total=nobs; 
    unique_ratio = nlevels/total ; 
run; 
proc print; run; 

Если у вас действительно есть большое количество уникальных значений, то вы, возможно, придется запустить это на просто случайное подмножество данных. PROC FREQ должен иметь возможность обрабатывать 10 000 наблюдений 700 переменных, даже если все они уникальны.

+0

Обратите внимание на вопрос: «Запуск PROC FREQ может сбой». Я не особо осуждаю их правдивость. – Joe

+0

Идея в исходном посте использования образца из 10 000 наблюдений будет работать. Даже когда все 700 + переменные уникальны, SAS может обрабатывать 700 * 10000 уникальных значений. – Tom

+0

Я понимаю (и согласен) - просто думал, что стоит упомянуть в ответе, так как вы явно против чего-то задают вопрос. – Joe

1
proc sql; 
    create table need as 
    select Distinct count(*) as unique_records,count(xxx)as number_of_rec 
    from have;`enter code here` 

    quit; 

    data need1; 
    set need; 
    ratio=(unique_records/number_of_rec)*100; 
    run; 
+0

Обратите внимание, что текст, который не является кодом, не должен быть отступом в блок кода; это должно быть в полных английских словах/предложениях («Ты» не «и» и т. д.); и он должен ответить на этот вопрос. «Я не уверен, что это сработает» не очень полезно, если вы не описываете сделанные вами предположения, о которых вы не уверены. – Joe

+0

Спасибо, Джо за предложения. – Ramu