2016-04-29 3 views
0

Я пытаюсь реализовать apriori algorithm в моей базе данных по r. как я это делаю, я понял, что алгоритм apriori возвращает объект s4. на самом деле это не проблема, если я не хотел писать результаты в базу данных.преобразование объекта s4 в data frame или list issue в r

Я начал писать свой код r следующим образом; сначала я загрузить пакеты Сопутствующих моего анализ

library(DBI) 
library(rJava) 
library(RJDBC) 
library(Matrix) 
library(grid) 
library(arules) 
library(arulesViz) 

getwd() 
setwd("D:/R") 
getwd() 

jdbcDriver<-JDBC(driverClass = "oracle.jdbc.OracleDriver",classPath = "D:/R/ojdbc6.jar") 
jdbcConnection<-dbConnect(jdbcDriver,"jdbc:oracle:ip:port","user","pass") 
ana_sorgu<- dbGetQuery(jdbcConnection,"SELECT action_id, product_cat FROM table") 
urunler<-dbGetQuery(jdbcConnection,"select distinct product_cat from product_cat") 

i <- split(ana_sorgu$PRODUCT_CAT,ana_sorgu$ACTION_ID) 
txn <- as(i, "transactions") 

sorgu2<-as.list(urunler$PRODUCT_CAT) 

for(row2 in 1:nrow(urunler)) { 
    basket_rules<-apriori(data=txn, parameter=list(supp=0.001,conf = 0.4), appearance = list(default="lhs",rhs=sorgu2[[row2]])) 
    deneme<-inspect(basket_rules)#i guess that something has to be changed to write here releated to next for loop but i can't 
    for(row in 1:length(basket_rules)) { 
     jdbcDriver2<-JDBC(driverClass = "oracle.jdbc.OracleDriver",classPath = "D:/R/ojdbc6.jar", identifier.quote = "\"") 
     jdbcConnection2<-dbConnect(jdbcDriver,"jdbc:oracle:ip:port","user","pass") 
     sorgu <- paste0("insert into market_basket_analysis_3 (lhs,rhs,support,confidence,lift) values ('",deneme$lhs[[row]],"','",deneme$rhs[[row]],"','",deneme$support[[row]],"','",deneme$confidence[[row]],"','",deneme$lift[[row]],"')") 
     print(sorgu) 
     result<-dbSendUpdate(jdbcConnection2,sorgu) 
     dbDisconnect(jdbcConnection2) 
}} 

я создал переменный, называемую sorgu2 сделать мой анализ категории dynamiccally продукции по категориям продукции, так что я реализован Urunler $ PRODUCT_CAT в as.list(). Поэтому я могу используйте его в rhs, чтобы в первом для цикла.

Наконец, когда я выполняю эту треску, она возвращается;

Apriori 
Parameter specification: 
confidence minval smax arem aval originalSupport support minlen maxlen target ext 
    0.4 0.1 1 none FALSE   TRUE 0.001  1  10 rules FALSE 
Algorithmic control: 
filter tree heap memopt load sort verbose 
0.1 TRUE TRUE FALSE TRUE 2 TRUE 

Absolute minimum support count: 854 

set item appearances ...[1 item(s)] done [0.00s]. 
set transactions ...[793 item(s), 854614 transaction(s)] done [0.34s]. 
sorting and recoding items ... [350 item(s)] done [0.05s]. 
creating transaction tree ... done [0.99s]. 
checking subsets of size 1 2 3 4 done [0.20s]. 
writing ... [0 rule(s)] done [0.00s]. 
creating S4 object ... done [0.12s]. 
[1] "insert into market_basket_analysis_3 (lhs,rhs,support,confidence,lift) values ('','','','','')" 
[1] "insert into market_basket_analysis_3 (lhs,rhs,support,confidence,lift) values ('','','','','')" 
Apriori 

Parameter specification: 
confidence minval smax arem aval originalSupport support minlen maxlen target ext 
    0.4 0.1 1 none FALSE   TRUE 0.001  1  10 rules FALSE 
Algorithmic control: 
filter tree heap memopt load sort verbose 
0.1 TRUE TRUE FALSE TRUE 2 TRUE 

Absolute minimum support count: 854 

set item appearances ...[1 item(s)] done [0.00s]. 
set transactions ...[793 item(s), 854614 transaction(s)] done [0.33s]. 
sorting and recoding items ... [350 item(s)] done [0.05s]. 
creating transaction tree ... done [0.98s]. 
checking subsets of size 1 2 3 4 done [0.20s]. 
writing ... [0 rule(s)] done [0.00s]. 
creating S4 object ... done [0.12s]. 
[1] "insert into market_basket_analysis_3 (lhs,rhs,support,confidence,lift) values ('','','','','')" 
[1] "insert into market_basket_analysis_3 (lhs,rhs,support,confidence,lift) values ('','','','','')" 
Error in asMethod(object) : 
NISASTA PATATES ALGR2 is an unknown item label 

, где я сделал ошибку? заранее спасибо.

+2

Это много кода, небольших пробелов и воспроизводимости. Пожалуйста, подумайте о том, чтобы указать проблему. –

ответ

2

Вы можете использовать unclass, чтобы увидеть содержимое объекта S4 производимого arules (показаны только первые 5 элементов объекта, который я назвал deneme, как у вас, но, очевидно, с разным содержанием):

> unclass(deneme[1:5]) 
<S4 Type Object> 
attr(,"quality") 
      support confidence  lift 
4  0.0001528538  1.0 1362.9583 
38 0.0001222830  1.0 1362.9583 
27287 0.0001222830  0.8 872.2933 
94270 0.0001222830  0.8 872.2933 
226 0.0001222830  0.8 817.7750 
attr(,"info") 
attr(,"info")$data 
msweb.trans 

attr(,"info")$ntransactions 
[1] 32711 

attr(,"info")$support 
[1] 1e-04 

attr(,"info")$confidence 
[1] 0.8 

attr(,"lhs") 
itemMatrix in sparse format with 
5 rows (elements/transactions) and 
284 columns (items) 
attr(,"rhs") 
itemMatrix in sparse format with 
5 rows (elements/transactions) and 
284 columns (items) 

вы получаете доступ к каждому из атрибутов с помощью attr:

> attr(deneme[1:5], "quality") 
      support confidence  lift 
4  0.0001528538  1.0 1362.9583 
38 0.0001222830  1.0 1362.9583 
27287 0.0001222830  0.8 872.2933 
94270 0.0001222830  0.8 872.2933 
226 0.0001222830  0.8 817.7750 

где quality является dataframe с 3-мя колоннами, вы можете получить доступ к каждому из них с помощью $:

> attr(deneme[1:5], "quality")$confidence 
[1] 1.0 1.0 0.8 0.8 0.8 

Хотя lhs и rhs являются itemMatrix объекты, вы можете получить фактические детали с помощью инспектировать, что-то вроде этого:

as(as(attr(deneme[1:5], "lhs"), "transactions"), "data.frame")$items 

Я бы сказал, что с этим подсказок вы можете изменить свой код вставить в базу данных; если у вас все еще есть сомнения, пожалуйста, дайте мне знать.

Надеюсь, это поможет.


EDIT после ваших комментариев: не используйте

as(as(attr(basket_rules, "lhs"), "transactions"), "data.frame")$items[[row]] 

но вместо

as(as(attr(basket_rules[row], "lhs"), "transactions"), "data.frame")$items 

Ваш окончательный код будет выглядеть примерно так:

for(row2 in 1:nrow(urunler)) { 
    basket_rules<-apriori(data=txn, parameter=list(supp=0.001,conf = 0.4), appearance = list(default="lhs",rhs=sorgu2[[row2]])) 
    for(row in 1:length(basket_rules)) { 
     jdbcDriver2<-JDBC(driverClass = "oracle.jdbc.OracleDriver",classPath = "D:/R/ojdbc6.jar", identifier.quote = "\"") 
     jdbcConnection2<-dbConnect(jdbcDriver,"jdbc:oracle:ip:port","user","pass") 
     sorgu <- paste0("insert into market_basket_analysis_3 (lhs,rhs,support,confidence,lift) values ('",as(as(attr(basket_rules[row], "lhs"), "transactions"), "data.frame")$items,"','",as(as(attr(basket_rules[row], "rhs"), "transactions"), "data.frame")$items,"','",attr(basket_rules[row],"quality")$support,"','",attr(basket_rules[row],"quality")$confidence,"','",attr(basket_rules[row],"quality")$lift,"')") 
     result<-dbSendUpdate(jdbcConnection2,sorgu) 
     dbDisconnect(jdbcConnection2) 
    } 
} 
+0

Здравствуйте, очень большое спасибо за вашу помощь. Я думаю, что я смогу изменить свой код с вашим объяснением, направлением и, конечно, я сообщу, если я не могу его изменить. Спасибо снова – pcpcne

+0

Вы более чем рады! Приветствия. – lrnzcig

+0

хороших ночей, я попытался реализовать ваши рекомендации по моему коду, но он снова дает мне ошибку, которая называется индексом вне пределов.это будет проблема, я продолжаю отвечать на мой вопрос? – pcpcne

Смежные вопросы