networkDynamic
各行がドキュメントへの人による貢献を表すトランザクション データから R でオブジェクトを構築したいと考えています。複数の寄与は、複数のエッジを作成するのではなく、エッジの重みの増加として表す必要があります。
問題を確認するには、次のコード スニペットを RStudio で簡単に再現できる必要があります。
if (!require("pacman")) install.packages("pacman"); library("pacman")
pacman::p_load(network, networkDynamic, ndtv, lubridate)
stTransac <- "
'person', 'document', 'weight', 'instantId'
'A', 'a1', '3', '1'
'A', 'a1', '15', '2'
'A', 'a1', '100', '3'
'B', 'a1', '20', '10'
'C', 'a1', '30', '12'
"
dfTransac <- read.csv(text = stTransac, sep = "," , quote = '\'' , strip.white = TRUE, stringsAsFactors = FALSE)
net <- network.initialize(0, directed = TRUE, bipartite = 3)
add.vertices.networkDynamic(net, 3, vertex.pid = c("A","B","C"))
add.vertices.networkDynamic(net, 1, vertex.pid = "a1")
net %v% "vertex.names" <- c(c("A","B","C"), "a1")
set.network.attribute(net,'vertex.pid','vertex.names')
set.network.attribute(net,'edge.pid','edge.names')
add.edges.networkDynamic(net,
tail = get.vertex.id(net, c("A","B","C")),
head = get.vertex.id(net, "a1"),
edge.pid = paste0(c("A","B","C"), "->a1"))
activate.edges(net,
e = get.edge.id(net, paste0(dfTransac[["person"]], "->a1")),
at = dfTransac$instantId)
これまでのところ、すべてが期待どおりに機能しています (activate.edge.attribute
下のブロックをスキップして最後のブロックに直接ジャンプすると、アニメーションでエッジが時間 1、2、3、10、12 でアクティブになっていることがわかります)。activate.edge.attribute
関数と同じ方法で関数を直感的に使用できます。activate.edges
最初のエッジでは、重み属性は3
の値でのみ初期化されます100
。前の 2 つの重み値は削除されます。
activate.edge.attribute(net,
prefix = "weight",
value = dfTransac$weight,
e = get.edge.id(net, paste0(dfTransac[["person"]], "->a1")),
at = dfTransac$instantId)
トランザクション データ フレームを反復処理することはできますが、これはうまくスケーリングできないと思います。
by(dfTransac, 1:nrow(dfTransac), function(row) {
net <<- activate.edge.attribute(net,
prefix = "weight",
value = row[["weight"]],
e = get.edge.id(net, paste0(row[["person"]], "->", row[["document"]])),
at = row[["instantId"]])
})
この最後のブロックはアニメーションをレンダリングします...
reconcile.vertex.activity(net = net, mode = "encompass.edges", edge.active.default = FALSE)
compute.animation(net, slice.par = list(start = 1, end = 13, interval = 1, aggregate.dur = 1, rule = "any"))
render.animation(net)
ani.replay()
at
重み属性を複数の異なるタイムスタンプに設定するための正しく効率的な方法は何ですか?