2011-10-02 4 views

Répondre

3

Une possible solution (pas nécessaire optimal) est la suivante (ce qui est une ligne unique, je romps il suffit de faire par souci de lisibilité):

unlist(lapply(get.adjlist(g, mode="out"), 
     function (neis) { 
      sum(V(g)[neis]$male, na.rm=T) 
     } 
))/degree(g, mode="out") 

Maintenant, nous allons le diviser en plus petits pièces. Tout d'abord, nous obtenons la liste d'adjacence du graphique en utilisant get.adjlist(g, mode="out"). Cela vous donne une liste de vecteurs, chaque vecteur contenant les voisins extérieurs d'un sommet. Ensuite, nous appliquons une fonction à chaque vecteur de cette liste en utilisant lapply. La fonction appliquée est la suivante:

function (neis) { 
    sum(V(g)[neis]$male, na.rm=T) 
} 

La fonction prend simplement les voisins d'un noeud dans neis et l'utilise pour sélectionner un sous-ensemble de sommets à partir de l'ensemble de vertex définir V(g). Ensuite, l'attribut male est récupéré pour ce sous-ensemble de vertex et les valeurs sont additionnées, en supprimant les valeurs NA à la volée. Essentiellement, cette fonction vous donne le nombre de mâles dans neis.

Maintenant, revenons à notre expression originale, nous avons appliqué cette fonction à la liste d'adjacence du graphe en utilisant lapply, obtenant une liste de nombres, chaque nombre contenant le nombre de voisins mâles d'un sommet donné. Nous convertissons cette liste en un seul vecteur R en utilisant unlist et le divisons élément par les out-degrés des sommets pour obtenir les ratios.

+0

Merci Tamas! À moins que je ne me trompe, quand l'indicateur masculin est manquant, il a le même résultat que si mâle = 0 ... en ajoutant le code en gras suivant à la fonction neis pourrait le faire correctement? {sum (V (g) [neis] $ mâle, na.rm = T **/somme (is.na (V (g) [neis] $ male) **} –

+0

qui devrait être: sum (! is. na (V (g) [neis] $ male) –

+0

Oui, ça devrait être OK Attention aux divisions par zéro, cependant, dans votre scénario, je pense qu'il est logique de penser que le numérateur est "fortement nul". Le moyen le plus simple est probablement de remplacer les valeurs NaN dans la liste par des zéros par la suite. –

Questions connexes