приложение plyr, создающее список матриц, каждая из которых соответствует подмножеству данных - PullRequest
0 голосов
/ 25 февраля 2011

С некоторой помощью я разобрался, как преобразовать список ребер, он же, список смежности в матрицу смежности . Я хочу научиться автоматизировать это для большого числа списков ребер, а затем поместите полученные матрицы смежности в список.

Я предполагаю, что plyr - лучший способ сделать это, но если вы хотите рассказать мне, как сделать это с помощью циклов, я был бы также благодарен за это. Для любопытных данные представляют социальные сети в разных школах.

Вот что у меня так далеко:

     # extract one school edgelist from the dataframe
aSchool <- myDF[which(myDF$school==1), c("school", "id", "x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")]

     # figure out unique ids
edgeColumns <- c("x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")
ids <- unique(unlist(aSchool[edgeColumns]))
ids <- ids[!is.na(ids)]
     # make an empty matrix
m <- matrix(0,nrow=length(ids),ncol=length(ids))
rownames(m) <- colnames(m) <- as.character(ids)
     # fill in the matrix
for(col in edgeColumns){
       theseEdges <- aSchool[c("id",col)]
       theseEdges <- na.omit(theseEdges)
       theseEdges <- apply(theseEdges,1,as.character)
       theseEdges <- t(theseEdges)
       m[theseEdges] <- m[theseEdges] + 1
}
for(i in 1:nrow(m)) m[i,i] <- 0

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

Проверьте пакет SNA и функции as.edgelist.sna() и as.sociomatrix.sna().

В частности, as.sociomatrix.sna() кажется здесь идеальным решением: он предназначен для преобразования списка ребер в матрицу смежности за один шаг (без потери таких атрибутов, как имена вершин и т. Д.). Завершите все это в разговоре с lapply(), и я думаю, что у вас есть еще одно (может быть, менее трудоемкое?) Решение.

Если вы хотите увидеть более выразительный ответ, я думаю, что было бы полезно либо предоставить более полные данные для примера, либо более четкое описание того, что именно в myDF

Кроме того, у меня нет репутации на SO , но я бы добавил несколько тегов к этому сообщению, чтобы показать, что речь идет о сетевом анализе.

1 голос
/ 25 февраля 2011

Трудно ответить на ваш вопрос без работоспособного примера. Но если я правильно понимаю ваш вопрос, вот функция, которая должна работать (возвращает список, содержащий симметричные матрицы смежности):

makeADJs <- function(...)
{
require(plyr)
dfs <- list(...)

e2adj <- function(x)
{
    IDs <- unique(c(as.matrix(x)))
    df <- apply(x,2,match,IDs)
    adj <- matrix(0,length(IDs),length(IDs))
    colnames(adj) <- rownames(adj) <- IDs
    a_ply(rbind(df,df[,2:1]),1,function(y){adj[y[1],y[2]] <<- 1})
    return(adj) 
}
llply(dfs,e2adj)
}

Пример:

makeADJs(
    cbind(letters[sample(1:26)],letters[sample(1:26)]),
    cbind(letters[sample(1:26)],letters[sample(1:26)]),
    cbind(letters[sample(1:26)],letters[sample(1:26)]),
    cbind(letters[sample(1:26)],letters[sample(1:26)])
    )

Edit:

или без plyr:

makeADJs <- function(...)
{
    dfs <- list(...)
    e2adj <- function(x)
    {
        IDs <- unique(c(as.matrix(x)))
        df <- apply(x,2,match,IDs)
        adj <- matrix(0,length(IDs),length(IDs))
        colnames(adj) <- rownames(adj) <- IDs
        apply(rbind(df,df[,2:1]),1,function(y){adj[y[1],y[2]] <<- 1})
        return(adj) 
    }
    lapply(dfs,e2adj)
}

Edit2:

И построить их все в одном файле PDF:

library(qgraph)
pdf("ADJplots.pdf")
l_ply(adjs,function(x)qgraph(x,labels=colnames(x)))
dev.off()
...