将 s4 对象转换为数据框或列出 r 中的问题
converting s4 object to data frame or list issue in r
我一直在尝试在 r 中对我的数据库实施 apriori algorithm
。当我这样做时,我意识到先验算法 returns 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 中使用它首先for循环。
最后当我执行这个 cod 时 returns;
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(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
是一个包含 3 列的数据框,您可以使用 $
:
访问每一列
> attr(deneme[1:5], "quality")$confidence
[1] 1.0 1.0 0.8 0.8 0.8
虽然 lhs
和 rhs
是 itemMatrix
对象,但您可以使用 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)
}
}
我一直在尝试在 r 中对我的数据库实施 apriori algorithm
。当我这样做时,我意识到先验算法 returns 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 中使用它首先for循环。
最后当我执行这个 cod 时 returns;
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(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
是一个包含 3 列的数据框,您可以使用 $
:
> attr(deneme[1:5], "quality")$confidence
[1] 1.0 1.0 0.8 0.8 0.8
虽然 lhs
和 rhs
是 itemMatrix
对象,但您可以使用 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)
}
}