首页 > 解决方案 > 如何将向量化事务转换为二进制矩阵事务

问题描述

我有一个只data.frame调用transactions一个字段的调用items,这样第 i 行由一个向量组成,其中包含第 i 个事务的项目,它看起来像这样:

> head(transactions)
                                              items
1                                       Cake, Fudge
2                                       Coffee, Tea
3                                Coffee, Choco, Tea
4                                            Coffee
5                                Bread, Muffin, Jam
6                                            Coffee

我想将其转换为二进制矩阵,这样每个元素都表示是否已为给定交易购买了给定对象,它应该如下所示:

   Cake  Fudge  Coffee  Tea  Choco  Bread  Muffin  Jam
1     1      1       0    0      0      0       0    0
2     0      0       1    1      0      0       0    0
3     0      0       1    1      1      0       0    0
4     0      0       1    0      0      0       0    0
5     0      0       0    0      0      1       1    1
6     0      0       1    0      0      0       0    0

如果没有阴暗的嵌套 for 循环,我找不到一种方法。这一切都是为了aprioriarules包裹中申请,如果你们中的任何人能帮我解决这个问题,将不胜感激。

谢谢!

标签: r

解决方案


我们可以创建新列来对每一行 ( row) 和我们想要在存在值 1 ( spread_value) 的情况下表示的值进行分组。我们使用separate_rows将每个逗号分隔的值拆分为单独的行。然后我们spread将值从长到宽,如果没有值,我们fill将其设为 0。

library(tidyverse)

df %>%
  mutate(row = row_number(), spread_value = 1) %>%
  separate_rows(items, sep = ",") %>%
  mutate(items = trimws(items)) %>%
  spread(items, spread_value, fill = 0) %>%
  select(-row)


#  Bread Cake Choco Coffee Fudge Jam Muffin Tea
#1     0    1     0      0     1   0      0   0
#2     0    0     0      1     0   0      0   1
#3     0    0     1      1     0   0      0   1
#4     0    0     0      1     0   0      0   0
#5     1    0     0      0     0   1      1   0
#6     0    0     0      1     0   0      0   0

推荐阅读