Создание индекса даты для реструктуризации данных - PullRequest
1 голос
/ 04 мая 2020

У меня есть набор данных, как в примере ниже (с тысячами строк для каждого участника):

participant-ID    date            duration
-------------------------------------------
id-1              01.01.2020      35
id-1              01.01.2020      15
id-1              01.01.2020      3
id-1              02.01.2020      120
id-1              02.01.2020      5
id-2              20.01.2020      13
id-2              20.01.2020      10
id-2              21.01.2020      450
id-2              21.01.2020      1

Некоторые пояснения к данным: Для каждого участника мы собрали данные за несколько недель каждый день (с разными датами начала и окончания для каждого участника) измеряется продолжительность времени, в течение которого они использовали свои смартфоны.

Сначала , я хотел бы изменить структуру так, чтобы сумма продолжительности рассчитывалась для каждого участника и каждой отдельной даты (день 1, день 2, ...). Это должно выглядеть так:

participant-ID    date            day          duration_sum
-----------------------------------------------------------
id-1              01.01.2020      1             53
id-1              02.01.2020      2             125
id-2              20.01.2020      1             23
id-2              21.01.2020      2             451

Секунда , я хотел бы создать еще один реструктурированный набор данных, такой, чтобы у меня была одна строка для каждого участника и суммы продолжительности для каждого индивидуальный день (день 1, день 2, день 3, ...). Даты в данном случае не имеют значения.

participant-ID       duration_sum_day1       duration_sum_day2     ...
----------------------------------------------------------------------
id-1                 53                      125                   ...
id-2                 23                      451                   ...

Я благодарен за любой совет!

1 Ответ

1 голос
/ 05 мая 2020

Для этого нужно несколько шагов. Сначала я воссоздаю данные вашего примера для демонстрации на:

data list list/ID (a10)   date  (edate10)   duration (f6).
begin data
id-1              01.01.2020      35
id-1              01.01.2020      15
id-1              01.01.2020      3
id-1              02.01.2020      120
id-1              02.01.2020      5
id-2              20.01.2020      13
id-2              20.01.2020      10
id-2              21.01.2020      450
id-2              21.01.2020      1
end data.

Теперь для работы:

* first step: summing durations per day (per ID).
dataset declare aggdata.
aggregate out=aggdata /break ID date /durationSum=sum(duration).
dataset activate aggdata.

* second step - creating a day index.
aggregate out=* mode=add /break ID/fstDay=min(date).
compute day=datediff(date, fstDay, "days")+1.
format day(f).

third step - restructure.
casestovars /id=ID /index=day /sep="_"/drop date.
...