Удаление повторяющихся элементов в категории в R - PullRequest
2 голосов
/ 18 октября 2019

У меня есть файл данных clickstream .csv в этом формате:

  Step_Name   Session_ID  Category
        p-1          1       A
        p-1          1       A
        p-1          1       A
        p-2          1       A
        defer        1       A
        p-1          2       B
        p-3          2       B
        p-3          2       B
        buy          2       B
        p-2          3       A
        p-3          3       A
        defer        3       A

Я хочу удалить повторяющиеся шаги внутри Session_ID (Пример: 3 шага p-1 в Session_ID= 1 следует считать шагом 1 p-1) и транспонировать столбец Step_Name, чтобы получить количество шагов для каждой категории.

     Category      p-1   p-2   p-3  p-4   buy  defer
        A           1     2     1    0     0     2
        B           1     0     1    0     1     0

Я работаю над этим в RStudio.

Ответы [ 3 ]

1 голос
/ 18 октября 2019

Ниже приведено решение 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)
)
0 голосов
/ 18 октября 2019

в базе R вы можете сделать:

t(table(unique(df)[-2]))
        Step_Name
Category buy defer p-1 p-2 p-3
       A   0     2   1   2   1
       B   1     0   1   0   1

, если вам вообще нужно это как фрейм данных, тогда

as.data.frame.matrix(t(table(unique(df)[-2])))
  buy defer p-1 p-2 p-3
A   0     2   1   2   1
B   1     0   1   0   1
0 голосов
/ 18 октября 2019

Один dplyr и tidyr параметр может быть:

df %>%
 distinct() %>%
 count(Step_Name, Category) %>%
 pivot_wider(names_from = "Step_Name", values_from = "n", values_fill = list(n = 0))

  Category   buy defer `p-1` `p-2` `p-3`
  <chr>    <int> <int> <int> <int> <int>
1 B            1     0     1     0     1
2 A            0     2     1     2     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...