【问题标题】:How to convert vectorized transactions into binary matrix transactions [duplicate]如何将矢量化事务转换为二进制矩阵事务[重复]
【发布时间】:2018-10-30 08:10:09
【问题描述】:

我有一个名为transactionsdata.frame,只有一个名为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 循环,我找不到一种方法。这就是从arules 包中应用apriori 的全部内容,如果你们中的任何人能帮我解决这个问题,将不胜感激。

谢谢!

【问题讨论】:

标签: r


【解决方案1】:

我们可以创建新的列来对每一行进行分组 (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

【讨论】:

    【解决方案2】:

    有来自splitstackshapecSplit_e 函数。

    df1 <- splitstackshape::cSplit_e(
      data = df,
      split.col = "items",
      sep = ", ",
      mode = "binary",
      fixed = TRUE,
      type = "character",
      fill = 0L,
      drop = TRUE
    )
    
    names(df1) <- sub("^items_", "", names(df1))
    df1
    #  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
    

    数据

    df <- structure(list(items = c("Cake, Fudge", "Coffee, Tea", "Coffee, Choco, Tea", 
    "Coffee", "Bread, Muffin, Jam", "Coffee")), .Names = "items", class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6"))
    

    【讨论】:

      【解决方案3】:

      非 dplyr 替代方案:

      library(magrittr)
      library(stringr)
      
      uniq_words <- df[["items"]] %>% 
        strsplit(", ") %>% 
        unlist() %>%
        unique()
      
      sol <- outer(df[["items"]], uniq_words, str_detect) * 1L
      colnames(sol) <- uniq_words
      
      sol
           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
      

      数据

      df <- data.frame(
        items = c(
          "Cake, Fudge", "Coffee, Tea", "Coffee, Choco, Tea", 
          "Coffee", "Bread, Muffin, Jam", "Coffee"
        ),
        stringsAsFactors = FALSE
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        • 2022-01-23
        • 2015-06-01
        • 2020-04-21
        • 1970-01-01
        • 2018-12-12
        • 1970-01-01
        相关资源
        最近更新 更多