Преобразовать фрейм данных в объект транзакции для функции apriori, не экспортируя и не перезагружая фрейм данных - PullRequest
0 голосов
/ 21 ноября 2018

У меня проблемы с преобразованием объекта dataframe в объект транзакции.Я создаю фрейм данных, сгруппированный по InvoiceNumber, и список продуктов, разделенных символом ',' (тогда фрейм данных содержит два столбца), все в порядке,

df = read.csv('Orders.csv', sep = ';', stringsAsFactors = T)
    df$Document.Date = as.Date(df$Document.Date, format = '%d/%m/%Y')

    library(tidyverse)
    library(plyr)

    grouping_for_AA =
        data.frame(
            df %>%
            group_by(Sales.Document,  Material) %>%
            dplyr::select(Sales.Document, Material, Document.Date)
        )


#Create transaction data building a list of material for each sales doc
#separated by a ,
transactionData = ddply(grouping_for_AA, c('Sales.Document'),
                        function(df) paste(df$Material,
                        collapse = ',')
                        )

, но когда я использую транзакции as (data, '') функция R говорит мне, что нужно дискретизировать ввод, поэтому я использую as.factor для столбца списка продуктов, но при этом каждая транзакция становится фактором уровня, и никакие правила не могут быть добыты (ясно).

#set column InvoiceNo of dataframe transactionData  
transactionData$Sales.Document <- NULL
#Change name of lists of Materials
colnames(transactionData) = 'Material'

#transform to factor
transactionData = data.frame(lapply(transactionData, factor))


#Create a transaction object: errors can be due to the package containing 'as'
trObj <- as(transactionData, "transactions")

Я уже пробовал кадры данных в формате сингла и в корзине, но не смог их решить.

Есть идеи, как преобразовать кадр данных в формат транзакции без экспорта и перезагрузки данных?

1 Ответ

0 голосов
/ 21 ноября 2018

Вы можете попробовать это, чтобы преобразовать data.frame в набор данных транзакций.Я добавил фиктивную дату, но я думаю, что она бесполезна, потому что вы не используете ее в своей разработке:

data$Document.Date <- Sys.Date()
data
  Sales.Document Material Document.Date
1              1        A    2018-11-21
2              1        B    2018-11-21
3              1        C    2018-11-21
4              2        A    2018-11-21
5              2        C    2018-11-21
6              3        A    2018-11-21

Теперь точно ваш набор данных: вы можете добавить data.frame() в цепочке dplyr:

library(tidyverse)
library(plyr)
grouping_for_AA <- data %>%
                   group_by(Sales.Document,  Material) %>%
                   dplyr::select(Sales.Document, Material, Document.Date) %>%
                   data.frame()

Теперь вы можете преобразовать данные транзакции:

library(arules)
library(reshape2)
trans <- as(split(grouping_for_AA[,"Material"], grouping_for_AA[,"Sales.Document"]), "transactions")

inspect(trans)
    items   transactionID
[1] {A,B,C} 1            
[2] {A,C}   2            
[3] {A}     3    

Наконец, вы можете применить функцию apriori():

rules <- apriori(trans, parameter = list(supp = 0.3, conf = 0.3, target="rules", minlen=2)) 
inspect(rules)
    lhs      rhs support   confidence lift count
[1] {B}   => {C} 0.3333333 1.0000000  1.5  1    
[2] {C}   => {B} 0.3333333 0.5000000  1.5  1    
[3] {B}   => {A} 0.3333333 1.0000000  1.0  1    
[4] {A}   => {B} 0.3333333 0.3333333  1.0  1    
[5] {C}   => {A} 0.6666667 1.0000000  1.0  2    
[6] {A}   => {C} 0.6666667 0.6666667  1.0  2    
[7] {B,C} => {A} 0.3333333 1.0000000  1.0  1    
[8] {A,B} => {C} 0.3333333 1.0000000  1.5  1    
[9] {A,C} => {B} 0.3333333 0.5000000  1.5  1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...