문제

두 열이있는 데이터가 있습니다 : 노드 A, 노드 B가있는 프레임이 있습니다. 프레임의 각 항목은 노드 A와 B 사이의 그래프의 모서리를 의미합니다.

이 data.frame을 인접한 목록으로 변환하려면 멋진 원 라이너가 있어야합니다. 힌트가 있습니까?

도움이 되었습니까?

해결책

빠르고 더러운 ...

> 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)

경고만이 정점은 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

R의 인접력 목록을 어떻게 대표 하시겠습니까? 인접한 노드 세트에 가변 크기 목록이 필요합니다. 그러면 list ()를 사용해야합니다. 그러나 R에서 무엇을 갖는가?

나는 Sapply와 같은 기능으로 절름발이 트릭을 생각할 수 있지만 모든 노드에 대해 선형 스캔을합니다. 그러나 1 분 동안 연주하는 것은 다음과 같습니다. 각 쌍의 두 번째 항목이 인접한 목록입니다. 출력은 Datstructure보다 더 미친 것입니다.

> 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