2017-10-02 2 views
2

Supposons que nous avons données suivantes de jouets:Comment éviter de boucle lorsque itérer valeurs uniques dans une colonne [R]

library(tidyverse) 
data <- tibble(
    subject = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3), 
    id1 = c("a", "a", "b", "a", "a", "a", "b", "a", "a", "b"), 
    id2 = c("b", "c", "c", "b", "c", "d", "c", "b", "c", "c") 
) 

qui représentent des relations de réseau pour chaque sujet. Par exemple, il y a trois sujets uniques dans les données et le réseau pour le premier sujet pourraient être représentés comme séquence de relations:

a -- b, a --c, b -- c 

La tâche consiste à calculer centralités pour chaque réseau. L'utilisation de la boucle c'est simple:

library(igraph) 
# Get unique subjects 
subjects_uniq <- unique(data$subject) 

# Compute centrality of nodes for each graph 
for (i in 1:length(subjects_uniq)) { 
    current_data <- data %>% filter(subject == i) %>% select(-subject) 
    current_graph <- current_data %>% graph_from_data_frame(directed = FALSE) 
    centrality <- eigen_centrality(current_graph)$vector 
} 

Question: Mon ensemble de données est énorme, je me demande donc comment éviter la boucle explicite for. Dois-je utiliser apply() et ses cousins ​​modernes (peut-être map() dans le paquet purrr)? Toutes les suggestions sont les bienvenues.

Répondre

4

est ici une option à l'aide map

library(tidyverse) 
library(igraph) 
map(subjects_uniq, ~data %>% 
        filter(subject == .x) %>% 
        select(-subject) %>% 
        graph_from_data_frame(directed = FALSE) %>% 
        {eigen_centrality(.)$vector}) 
#[[1]] 
#a b c 
#1 1 1 

#[[2]] 
#  a   b   c   d 
#1.0000000 0.8546377 0.8546377 0.4608111 

#[[3]] 
#a b c 
#1 1 1