我将尝试使用样本数据
data("Groceries")
来演示这个问题,数据来自Library(arules)
。#Pre-defined library
library(arules)
library(arulesViz)
library(visNetwork)
library(igraph)
#Get sample data & get association rules
data("Groceries")
rules <- apriori(Groceries, parameter=list(support=0.01, confidence=0.4))
rules <- head(sort(rules, by="lift"), 10)
#Convert rules to data.table
library(data.table)
rules_dt <- data.table( lhs = labels( lhs(rules) ),
rhs = labels( rhs(rules) ),
quality(rules) )[ order(-lift), ]
打印所有规则,以表格格式排序(按提升度)。
使用igraph绘制前10个关联规则的图表
ig <- plot(rules, method="graph", control=list(type="items"))
注意:基于关联规则,我使用igraph绘制了一个网络图,一切都正确。接下来,我将尝试将现有的igraph转换为visNetwork,然后我们比较结果。tf <- tempfile( )
saveAsGraph(rules, file = tf, format = "dot" )
# clean up temp file if desired
#unlink(tf)
# Convert igraph to dataframe
ig_df <- as_data_frame(ig, what = "both")
# Plot visNetwork
visNetwork(
nodes = data.frame(
id = ig_df$vertices$name
,value = ig_df$vertices$lift # could change to lift or confidence
,title = ifelse(ig_df$vertices$label == "",ig_df$vertices$name,
ig_df$vertices$label)
,ig_df$vertices
),
edges = ig_df$edges
) %>%
visEdges(arrows ="to") %>%
visOptions( highlightNearest = T )
使用visNetwork绘制前10个关联规则的图表。
![enter image description here](https://istack.dev59.com/m4c5P.webp)
让我们比较igraph和visNetwork。
![enter image description here](https://istack.dev59.com/qS4Kq.webp)
问题。
我试图进一步深入研究 ig_df <- get.data.frame( ig, what = "both" )
,并发现在从 library(igraph)
中的 as_data_frame
函数生成的 ig_df$vertices
表格中有一些奇怪的东西。 我发现关联规则编号10的截距节点assoc10实际上对于所有变量(即“support”、“confidence”、“lift”和“count”)都有
NA
,更准确地说,在 ig_df$vertices
中,“support”、“confidence”、“lift”和“count”列的维度向上移动了一行!如果我错了,请纠正我。
结论
将igraph转换为visNetwork的关键是使用as_data_frame
从igraph中提取所有数据并将这些数据转换为数据帧,然后使用从提取的数据框绘制visNetwork。但是由于在使用as_data_frame
从igraph中提取数据时存在提取问题,因此结果也会有所不同。
问题:这是一个错误吗?还是我在代码上犯了错误?欢迎任何建议。谢谢!
support = 0.001
更改为support = 0.01
,将confidence = 0.5
更改为confidence = 0.4
。现在rules
应该与所示相同 :) - yc.koong