2017-08-01 14 views
0

データフレームDFがあります内の1つの列の値は、その最初の21行は、次のとおりループRのデータフレーム

 npi_one  npi_two weight hee_provn1 
1 n1487676045 n1467400598 1  015171 
2 n1952484560 n1467400598 1  015171 
3 n1952484560 n1487676045 1  015171 
4 n1467430777 n1508874751 1  015443 
5 n1467430777 n1538176391 1  015443 
6 n1538176391 n1508874751 1  015443 
7 n1114030491 n1114977360 1  035084 
8 n1114030491 n1912002742 1  035084 
9 n1114977360 n1912002742 1  035084 
10 n1508852716 n1114030491 1  035084 
11 n1508852716 n1114977360 1  035084 
12 n1508852716 n1912002742 1  035084 
13 n1831185370 n1114030491 1  035084 
14 n1831185370 n1114977360 1  035084 
15 n1831185370 n1508852716 1  035084 
16 n1831185370 n1912002742 1  035084 
17 n1831185370 n1932248952 1  035084 
18 n1932248952 n1114030491 1  035084 
19 n1932248952 n1114977360 1  035084 
20 n1932248952 n1508852716 1  035084 
21 n1932248952 n1912002742 1  035084 

私は列hee_proven1に応じてこのテーブルをループしたいです。

最初のループのコードは次のとおり

library(igraph) 
library(dplyr) 
library(data.table) 

df2 <- filter(df, hee_provn1 == '015171') 
df3 <- df2 [,c("npi_one","npi_two")] 
l = c(apply(df3,1,c)) 
G <- graph(l,directed = FALSE) 

d <- degree(G) 
c <- closeness(G,weight = df2$weight) 
b <- betweenness(G, weight = df2$weight) 
e <- eigen_centrality(G,weight = df2$weight)$vector 

cent_df = data.frame(d,c,b,e) 
colnames(cent_df) <- c('degree', 'closeness','betweenness','eigen') 
setDT(cent_df, keep.rownames = TRUE)[] 
setnames(cent_df,1,"npi") 
cbind(hee_provn1 = '015171',cent_df) 

最初のループの結果(hee_provn1 = '015171')

hee_provn1   npi degree closeness betweenness eigen 
1:  015171 n1487676045  2  0.5   0  1 
2:  015171 n1467400598  2  0.5   0  1 
3:  015171 n1952484560  2  0.5   0  1 

そして第二のループの結果(hee_provn1 =です「015443」)は

hee_provn1   npi degree closeness betweenness eigen 
1:  015443 n1467430777  2  0.5   0  1 
2:  015443 n1508874751  2  0.5   0  1 
3:  015443 n1538176391  2  0.5   0  1 

ですそして、私の最終的な結果は、一緒にすべての結果表を入れたい

hee_provn1   npi degree closeness betweenness eigen 
1:  015171 n1487676045  2  0.5   0  1 
2:  015171 n1467400598  2  0.5   0  1 
3:  015171 n1952484560  2  0.5   0  1 
4:  015443 n1467430777  2  0.5   0  1 
5:  015443 n1508874751  2  0.5   0  1 
6:  015443 n1538176391  2  0.5   0  1 

何らかの理由で私はRパッケージtidyverseを使用できませんが、できるだけ効率的に使用できることを願っています。ありがとう。

答えて

0

古い質問です...しかし、運動のために、ここで私が思い付いたものです:

library(tidyverse) 

newdf <- 
    df %>% 
    rowid_to_column() %>% 
    mutate(rowid = as.factor(rowid)) %>% 
    gather(key = "whichnpi", value = "npi", npi_one, npi_two) %>% 
    arrange(hee_provn1, rowid) %>% 
    group_by(hee_provn1, rowid) %>% 
    nest() %>% 
    mutate(npi = map(.$data, ~ .$npi), 
     G = map(.$data, ~ graph(.$npi)), 
     degree = map(G, ~ degree(.x)) , 
     closeness = map(G, ~ closeness(.x, weight = .$weight)) , 
     betweenness = map(G, ~ betweenness(.x, weight = .$weight)) , 
     eigen = map(G, ~ eigen_centrality(.x, weight = .$weight)$vector) 
     ) %>% 
    select(-data, -G, -rowid) %>% 
    unnest() %>% 
    arrange(hee_provn1) 
関連する問題