簡體   English   中英

將S4對象轉換為R中的數據框或列表問題

[英]converting s4 object to data frame or list issue in r

我一直在嘗試在r中對數據庫執行apriori algorithm 當我這樣做時,我意識到apriori算法返回s4對象。 實際上,如果我不想將結果寫入數據庫,這不是問題。

我開始這樣寫我的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的變量,以便按產品類別對產品類別進行動態分析,因此我在as.list()中實現了urunler $ PRODUCT_CAT。因此,我可以在循環中的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

我在哪里做錯了? 提前致謝。

您可以使用unclass來查看由arules生成的S4對象的內容(僅顯示我稱為deneme的對象的前5個元素,就像您的元素一樣,但顯然具有不同的內容):

> 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

> 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是一個包含三列的數據框,則可以使用$來訪問它們:

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

盡管lhsrhsitemMatrix對象,但是您可以使用inspect來獲取實際的項目,如下所示:

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

我想以此暗示,您可以修改代碼以插入數據庫; 如果您仍有疑問,請告訴我。

希望能幫助到你。


評論后編輯 :請勿使用

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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM