2016-02-19 6 views
0

Вот мои данные:свертывать данные в SAS

data example; 
    input id sports_name; 
    datalines; 
    1 baseball 
    1 basketball 
    1 cricket 
    1 soccer 
    2 golf 
    2 fencing 

Это всего лишь пример. Переменная sports_name категорична с 56 типами. Я пытаюсь перенести данные в широкую форму, где каждая строка будет иметь user_id и имена видов спорта, поскольку переменные со значениями 1/0 указывают на присутствие или отсутствие.

До сих пор я использовал процедуру proc freq для получения таблицы с перекрестными таблицами и помещал ее в другой набор данных, а затем переносил эти данные. Теперь у меня есть недостающие значения в некоторых случаях и количество видов спорта в остальных случаях.

Есть ли лучший способ сделать это?

Спасибо!

+0

Показать все ваши коды и текущие результаты, которые вы получаете. Предоставьте также некоторые идентификаторы пользователей. –

ответ

0

Вам нужен способ создать что-то из ничего. Вы также могли бы использовать опцию SPARSE в PROC FREQ. имена SAS не может иметь длину больше, чем 32.

data example; 
    input id sports_name :$16.; 
    retain y 1; 
    datalines; 
    1 baseball 
    1 basketball 
    1 cricket 
    1 soccer 
    2 golf 
    2 fencing 
;;;; 
    run; 
proc print; 
    run; 
proc summary data=example nway completetypes; 
    class id sports_name; 
    output out=freq(drop=_type_); 
    run; 
proc print; 
    run; 
proc transpose data=freq out=wide(drop=_name_); 
    by id; 
    var _freq_; 
    id sports_name; 
    run; 
proc print; 
    run; 

enter image description here

0

же теории здесь, создать список всех возможных комбинаций с использованием SQL вместо Proc Резюме и затем перенося результаты.

data example; 
informat sports_name $20.; 
    input id sports_name $; 
    datalines; 
    1 baseball 
    1 basketball 
    1 cricket 
    1 soccer 
    2 golf 
    2 fencing 
; 
run; 

proc sql; 
create table complete as 
select a.id, a_x.sports_name, case when not missing(e.sports_name) then 1 else 0 end as Present 
from (select distinct ID from example) a 
cross join (select distinct sports_name from example) a_x 
full join example as e 
on e.id=a.id 
and e.sports_name=a_x.sports_name; 
quit; 

proc transpose data=complete out=want; 
by id; 
id sports_name; 
var Present; 
run; 
Смежные вопросы