2

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重み属性を複数の異なるタイムスタンプに設定するための正しく効率的な方法は何ですか?

4

1 に答える 1

4

一部効率上の理由から、アトリビュート アクティベート コードは頂点/エッジごとに複数のスペルをアクティベートできません。ドキュメントが言うように:

... 1 つの関数呼び出しを使用して、各頂点で異なるアクティビティ時間で複数の頂点の複数の値をアクティブにすることは可能ですが、1 つの呼び出しで単一の頂点で複数の値を複数回アクティブにすることはできません。

コンストラクター関数を使用してネットワークを作成するには、次の構文をお勧めしますnetworkDynamic()。これには、属性を同時にインポートするオプションがあります。

# re-arrange the data.frame column order to an edge.spell format, 
# duplicating the time to use for onset and terminus
input<-dfTransac[,c(4,4,1,2,3)]

# convert the ids to numeric
ids<-unique(c(dfTransac$person,dfTransac$document))
input[,3]<-match(input[,3],ids)
input[,4]<-match(input[,4],ids)
input
  instantId instantId.1 person document weight
1         1           1      1        4      3
2         2           2      1        4     15
3         3           3      1        4    100
4        10          10      2        4     20
5        12          12      3        4     30

# initialize a base network with the appropriate characteristics
net<-network.initialize(length(ids),bipartite=3)
# copy in the vertex names
network.vertex.names(net)<-ids

# use the networkDynamic constructor, telling it to create dynamic attributes
netDyn <- networkDynamic(net,edge.spells = input,
+                          create.TEAs = TRUE,edge.TEA.names = 'weight')

Activated TEA edge attributes:  weightCreated net.obs.period to describe network
 Network observation period info:
  Number of observation spells: 1 
  Maximal time range observed: 1 until 12 
  Temporal mode: continuous 
  Time unit: unknown 
  Suggested time increment: NA 

# print out the attributes structure for edge 1 to double check
get.edge.attribute(netDyn,'weight.active',unlist=FALSE)[[1]]
[[1]]
[[1]][[1]]
[1] 3

[[1]][[2]]
[1] 15

[[1]][[3]]
[1] 100


[[2]]
     [,1] [,2]
[1,]    1    1
[2,]    2    2
[3,]    3    3

したがって、最初のエッジに「重み」の期待される 3 つの値があることがわかります。networkDynamic()動的アトリビュートを適切にアタッチするには、同様のループを実行する必要がありますが、少なくともすべて内部で行われることに注意してください。

于 2016-09-15T18:24:32.340 に答える