Ниже приведено решение data.table
, для записи:
Код
dcast(dt[, unique(Step_Name), .(Category, Session_ID)], Category ~ V1)
Category buy defer p-1 p-2 p-3 p-4
1: A 1 3 1 1 0 1
2: B 0 0 0 1 1 1
Код (пошаговый)
Сначала мы хотим перечислить количество уникальных Step_Name
записей для каждой пары Session_ID
- Category
. Мы делаем это, выполняя следующий код.
dt_step1 = dt[, unique(Step_Name), keyby = .(Category, Session_ID)]
# data.table generic syntax dt[i, j, by]
# i = which rows? (all)
# j = which action? (unique(Step_Name)) will be called V1 as default
# by = by which groups (Category-Session_ID pairs)
> dt_step1
Category Session_ID V1
1: A 1 buy
2: A 1 p-2
3: A 1 defer
4: A 1 p-4
5: A 2 defer
6: A 3 defer
7: A 3 p-1
8: B 2 p-2
9: B 2 p-3
10: B 3 p-4
Далее мы хотим перенести эти данные в широкоформатный формат. Мы делаем это, предоставляя dt_step1
для dcast()
и формулу наших переменных (мы хотим, чтобы Category
вдоль 'оси Y' и наблюдения V1
вдоль 'оси X'.
dt_step2 = dcast(dt_step1, Category ~ V1, value.var = 'V1')
value.var
- это просто то, какая переменная будет «заполнять» нашу таблицу. По умолчанию она будет V1
, но вы также можете указать ее конкретно.
> dt_step2
Category buy defer p-1 p-2 p-3 p-4
1: A 1 3 1 1 0 1
2: B 0 0 0 1 1 1
Данные
set.seed(2)
n = 10
dt = data.table(
Step_Name = sample(c('p-1', 'p-2', 'p-3', 'p-4', 'buy', 'defer'), n, T),
Session_ID = sample(c(1,2,3), n, T),
Category = sample(c('A', 'B'), n, T)
)