将数据框转换为先验函数的事务对象,而无需导出和重新加载数据框
Transform a dataframe to a transaction object for the apriori function without exporting and reloading the 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, 'transactions') 函数时 R 告诉我要离散化输入,所以我使用 as.factor 作为 Product list 列,但是这样做每个交易都会成为一个因素水平,无法挖掘规则(显然)。
#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")
我已经试过单一和篮子格式的数据框,但我无法解决它。
关于如何在不导出和重新加载数据的情况下将数据帧转换为事务格式的想法?
您可以试试这个,将您的 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
现在正是您的数据集:您可以在 dplyr 链中添加 data.frame()
:
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
我在将数据框对象转换为事务对象时遇到了麻烦。 我创建了一个按 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, 'transactions') 函数时 R 告诉我要离散化输入,所以我使用 as.factor 作为 Product list 列,但是这样做每个交易都会成为一个因素水平,无法挖掘规则(显然)。
#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")
我已经试过单一和篮子格式的数据框,但我无法解决它。
关于如何在不导出和重新加载数据的情况下将数据帧转换为事务格式的想法?
您可以试试这个,将您的 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
现在正是您的数据集:您可以在 dplyr 链中添加 data.frame()
:
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