Ниже приведен пример того, что я нашел, чтобы изменить данные с длинного на широкий. Но я не могу понять код, особенно то, как они заменяют пробелы и почему. Может кто-нибудь помочь мне понять код?Переформатирование данных от длинного до широкого
Пример 1: Перестройка одна переменная
Начнем с небольшой набор данных только с одной переменной, подлежащей видоизменен. Мы будем использовать переменные year и faminc (для семейного дохода) для создания трех новых переменных: faminc96, faminc97 и faminc98. Во-первых, давайте посмотрим на набор данных и используем proc print для его отображения.
DATA long ;
INPUT famid year faminc ;
CARDS ;
1 96 40000
1 97 40500
1 98 41000
2 96 45000
2 97 45400
2 98 45800
3 96 75000
3 97 76000
3 98 77000
;
RUN ;
PROC PRINT DATA=long ;
RUN ;
Obs famid year faminc
1 1 96 40000
2 1 97 40500
3 1 98 41000
4 2 96 45000
5 2 97 45400
6 2 98 45800
7 3 96 75000
8 3 97 76000
9 3 98 77000
Теперь давайте посмотрим на программу. Первым шагом в процессе преобразования является сортировка данных (с использованием сортировки proc) на идентификационной переменной (famid) и сохранение набора отсортированных данных (longsort). Затем мы пишем шаг данных для фактической перестройки. Мы объясним каждое из утверждений на шаге данных по порядку.
PROC SORT DATA=long OUT=longsort ;
BY famid ;
RUN ;
DATA wide1 ;
SET longsort ;
BY famid ;
KEEP famid faminc96 -faminc98 ;
RETAIN faminc96 - faminc98 ;
ARRAY afaminc(96:98) faminc96 - faminc98 ;
IF first.famid THEN
DO;
DO i = 96 to 98 ;
afaminc(i) = . ;
END;
END;
afaminc(year) = faminc ;
IF last.famid THEN OUTPUT ;
RUN;
Также вы можете исследовать в качестве альтернативы Proc транспонирования; пример кода proc transpose data = dataset out = reqd_ds; от семьи; год; var faminc; бег; –