首页 > 解决方案 > 删除R中类别中的重复元素

问题描述

我有一个这种格式的点击流 .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 中的重复步骤例如:Session_ID = 1 中的 3 p-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 中处理这个问题。

标签: rdplyr

解决方案


以下是一个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_step1dcast()我们想要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)
)

推荐阅读