首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除R中类别中的重复元素

删除R中类别中的重复元素
EN

Stack Overflow用户
提问于 2019-10-18 06:50:11
回答 3查看 155关注 0票数 2

我有一个按此格式的点击流.csv数据文件:

代码语言:javascript
复制
  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中的3p-1步骤应算作1p-1步骤),并转置Step_Name列以获得每个类别的步骤数。

代码语言:javascript
复制
     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上做这个工作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-18 08:26:27

下面是一个data.table解决方案,用于记录:

代码语言:javascript
复制
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

码(一步一步)

首先,我们要列出每个Session_ID-Category对的唯一Category条目的数量。我们通过执行以下代码来做到这一点。

代码语言:javascript
复制
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轴,并在x轴上观察V1。)

代码语言:javascript
复制
dt_step2 = dcast(dt_step1, Category ~ V1, value.var = 'V1')

value.var仅仅是哪个变量将“填充”我们的表。这将默认为V1,但您也可以专门提供它。

代码语言:javascript
复制
> 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

数据

代码语言:javascript
复制
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)
)
票数 1
EN

Stack Overflow用户

发布于 2019-10-18 06:57:14

一个dplyrtidyr选项可以是:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-10-18 06:59:00

在R基,你可以:

代码语言:javascript
复制
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

如果您需要它作为一个数据,那么

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58445386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档