سؤال

لدي بيانات .fame مع 2 أعمدة: عقدة A، العقدة ب. كل إدخال في الإطار يعني حافة في الرسم البياني بين العقدة A و B.

يجب أن يكون هناك بطانة واحدة لطيفة لتحويل هذه البيانات. الإطار في قائمة مجاورة. أي تلميحات؟

هل كانت مفيدة؟

المحلول

سريع و قذر ...

> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5))

> adjlist <- by(edges, edges$nodea, function(x) x$nodeb)

> for (i in as.character(unique(edges$nodea))) {
+   cat(i, ' -> ', adjlist[[i]], '\n')
+ }

1  ->  1 5
2  ->  2 4
4  ->  3

> adjlist
edges$nodea: 1
[1] 1 5
------------------------------------------------------------
edges$nodea: 2
[1] 2 4
------------------------------------------------------------
edges$nodea: 4
[1] 3

نصائح أخرى

منذ أن تم وضع علامة على هذا , ، ماذا عن استخدام وظيفة المدمج؟

> g <- graph.data.frame( edges )
> adjlist <- get.adjedgelist(g)

التحذير فقط هي القمم صفر مفهرسة، والتي ستتغير مع Igriph 0.6.

> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5))

> attach(edges)

> tapply(nodeb,nodea,unique)

$`1`
[1] 1 5

$`2`
[1] 2 4

$`4`
[1] 3

كيف تمثل حتى قائمة مجاورة في ص؟ يحتاج إلى قوائم متغيرة الحجم لمجموعة العقد المجاورة؛ لذلك، يجب عليك استخدام قائمة ()؛ ولكن بعد ذلك ما هو جيد هل لديك في ص؟

يمكنني التفكير في الحيل العرجاء مع وظائف تشبه sapply لكنها تقوم بمسح خطي لكل عقدة. لكن اللعب لمدة دقيقة واحدة، هنا هو: قائمة بالأراة الزوجية، حيث العنصر الثاني من كل زوج هو قائمة المجاورة. الإخراج جنون من Datationfulture هو حقا.

> edgelist=data.frame(A=c(1,1,2,2,2),B=c(1,2,2,3,4))
> library(plyr)
> llply(1:max(edgelist), function(a) list(node=a, adjacents=as.list(edgelist$B[edgelist$A==a])))
[[1]]
[[1]]$node
[1] 1

[[1]]$adjacents
[[1]]$adjacents[[1]]
[1] 1

[[1]]$adjacents[[2]]
[1] 2



[[2]]
[[2]]$node
[1] 2

[[2]]$adjacents
[[2]]$adjacents[[1]]
[1] 2

[[2]]$adjacents[[2]]
[1] 3

[[2]]$adjacents[[3]]
[1] 4



[[3]]
[[3]]$node
[1] 3

[[3]]$adjacents
list()


[[4]]
[[4]]$node
[1] 4

[[4]]$adjacents
list()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top