как бы вы представляли список смежности в R? ему нужны списки переменного размера для набора соседних узлов; поэтому вам нужно использовать список(); но тогда, какая польза от него в R?
Я могу думать о хромых трюках с подобными функциям, но они выполняют линейное сканирование для каждого узла. но играя в течение 1 минуты, вот: список парных списков, где вторым элементом каждой пары является список смежности. выход более сумасшедший, чем на самом деле.
> 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()
Guh. Ага. Это идеальный лайнер. Как ни странно, мое решение для цикла работает в два раза быстрее, чем by(). –
действительно не очень быстро, когда ваш стол длиннее 50 000 (с ~ 5000 идентификаторами). Существуют ли более быстрые альтернативы? –