Хобрук: Ваш путь к мастерству в программировании

Как сделать сводную таблицу в SAS

У меня есть следующая таблица

+--------+----------+-----------+
| ID     | var_name | var_value |
+--------+----------+-----------+
| 153879 | age      | 35        |
+--------+----------+-----------+
| 153879 | gender   | Male      |
+--------+----------+-----------+
| 153879 | income   | 1000      |
+--------+----------+-----------+
| 13527  | age      | 18        |
+--------+----------+-----------+
| 13527  | gender   | Male      |
+--------+----------+-----------+
| 13527  | income   | 20        |
+--------+----------+-----------+
| 14416  | age      | 40        |
+--------+----------+-----------+
| 14416  | gender   | Female    |
+--------+----------+-----------+
| 14416  | income   | 500       |
+--------+----------+-----------+

Как я могу сделать из этого сводную таблицу, чтобы результат выглядел так

+--------+-----+--------+--------+
| ID     | age | gender | income |
+--------+-----+--------+--------+
| 153879 | 35  | Male   | 1000   |
+--------+-----+--------+--------+
| 13527  | 18  | Male   | 20     |
+--------+-----+--------+--------+
| 14416  | 40  | Female | 500    |
+--------+-----+--------+--------+

Я попытался сделать это, неоднократно оставляя соединение с таблицей таким образом:

data table;
    input id $ var_name $ var_value $;
datalines;
153879 age 35
153879 gender Male
153879 income 1000
13527  age 18
13527  gender Male
13527  income 20
14416  age 40
14416  gender Female
14416  income 500
run;


Proc SQL;
    Create table have as
    Select a.ID
          ,b.var_value as age
          ,c.var_value as gender
          ,d.var_value as income
    From (select distinct id from table) as a
    Left Join (select * from table where var_name = 'age') as b
        On a.id = b.id
    Left Join (select * from table where var_name = 'gender') as c
        On a.id = c.id
    Left Join (select * from table where var_name = 'income') as d
        On a.id = d.id;
Quit;

Используя этот код, я получаю требуемые результаты, однако, поскольку реальная таблица в несколько раз больше и включает более 50 переменных, я хотел бы знать, есть ли другой способ сделать это, более эффективный и короткий.

14.05.2020

Ответы:


1

Транспонируйте свою таблицу с помощью PROC TRANSPOSE. Сначала вам нужно отсортировать или проиндексировать его по id и предварительно агрегировать значения, если есть повторяющиеся значения id и var_name.

proc sql noprint;
    create table have_aggregated as 
        select id
             , var_name
             , sum(var_value) as var_value
        from have
        group by id, var_name
        order by id, var_name
    ;
quit;

proc transpose data=have_aggregated
               out=want(drop=_NAME_);
    by id;
    id var_name;
    var var_value;
run;
14.05.2020
  • Спасибо за ответ, все решилось, но есть один вопрос. Что делать, если у меня есть идентификаторы с повторяющимися значениями var_name. Например, если ID 153879 имеет два значения дохода? В этом случае приведенный выше код дает следующую ошибку ERROR: The ID value "Income" occurs twice in the same BY group. Предположим, я хочу суммировать оба значения в одно, как будет выглядеть код? 15.05.2020
  • Сначала вам нужно будет предварительно агрегировать их по id и var_name. Я обновил код с этим изменением. Он будет агрегировать и сортировать за один шаг. 15.05.2020
  • Новые материалы

    Библиотеки PyTorch и Python для машинного обучения: приложения в здравоохранении с обнимающим лицом…
    В сфере машинного обучения Python выделяется благодаря своей универсальности и набору предлагаемых библиотек. Развитие машинного обучения в здравоохранении можно частично объяснить простотой и..

    «Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!
    «Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!

    5 вещей, которые я сделал, чтобы стать профессиональным разработчиком JavaScript
    Чтобы стать профессиональным JS-разработчиком: 1. Практикуйтесь в рутине, 2. Работайте над проектами, 3. Придерживайтесь одного языка, 4. Наблюдайте за чужим кодом, 5. Будьте последовательны..

    От теории к практике: пошаговое руководство по реализации наивного Байеса
    Вы когда-нибудь застревали в проекте классификации, не зная, как точно предсказать результаты для ваших данных? Вы искали более простой и интуитивно понятный алгоритм, который поможет вам достичь..

    #093 | Моделирование вспышки эпидемии с помощью JavaScript — Часть 3
    TLDR: Я сделал симуляцию вспышки эпидемии, в которую можно поиграть здесь . Мой холст, моя сцена Мой HTML — это всего лишь один div с классом stage, и вот как я настроил на нем свой объект..

    numberToString.js (8kyu 16)
    Алгоритм кодовых войн Проблема Нам нужна функция, которая может преобразовать число в строку. 숫자를 문자열로 변환하는 함수를 작성해라. Решение 01 function numberToString(n) { return n.toString(); }..

    Лучшие практики для быстрого изучения языка программирования
    Изучение языка программирования может быть сложной задачей, но при правильном подходе определенно возможно быстро выучить язык программирования. Хорошее понимание языка программирования может..