2017-08-01 167 views
0

我有一个R这样的数据帧df。我想循环通过DF根据hee_provn1的不同值R:遍历一列数据帧并输出

npi_one npi_two hee_provn1 
1  2  175221 
3  4  175221 
5  6  175221 
7  8  175221 
9  10  576546 
11  12  576546 
13  14  576546 
15  16  789535 
17  18  789535 
19  20  789535 

现在我的R代码里面是:

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

degree(G) -> d 
closeness(G) -> c 
betweenness(G) -> b 
eigen_centrality(G)$vector -> e 

cent_df = data.frame(d,c,b,e) 
colnames(cent_df) <- c('degree', 'closeness','betweenness','eigen') 
cbind(hee_provn1 = 175221,cent_df) 

第一环路的结果表cent_df(hee_provn1 = 175221)是

hee_provn1 degree closeness betweenness  eigen 
1  175221  1 0.02040816   0 0.3227867 
2  175221  1 0.02040816   0 0.3227867 
3  175221  1 0.02040816   0 0.0000000 
4  175221  1 0.02040816   0 0.0000000 
5  175221  1 0.02040816   0 1.0000000 
6  175221  1 0.02040816   0 1.0000000 
7  175221  1 0.02040816   0 0.0000000 
8  175221  1 0.02040816   0 0.0000000 

第二环(hee_provn1 = 576546)的结果表cent_df是

hee_provn1 degree closeness betweenness eigen 
1  576546  0 0.005494505   0  0 
2  576546  0 0.005494505   0  0 
3  576546  0 0.005494505   0  0 
4  576546  0 0.005494505   0  0 
5  576546  0 0.005494505   0  0 
6  576546  0 0.005494505   0  0 
7  576546  0 0.005494505   0  0 
8  576546  0 0.005494505   0  0 
9  576546  1 0.005917160   0  1 
10  576546  1 0.005917160   0  1 
11  576546  1 0.005917160   0  0 
12  576546  1 0.005917160   0  0 
13  576546  1 0.005917160   0  0 
14  576546  1 0.005917160   0  0 

我的想法结果槽形一个循环,我可以把所有的结果表一起在一个大的表像

hee_provn1 degree closeness betweenness  eigen 
1  175221  1 0.02040816   0 0.3227867 
2  175221  1 0.02040816   0 0.3227867 
3  175221  1 0.02040816   0 0.0000000 
4  175221  1 0.02040816   0 0.0000000 
5  175221  1 0.02040816   0 1.0000000 
6  175221  1 0.02040816   0 1.0000000 
7  175221  1 0.02040816   0 0.0000000 
8  175221  1 0.02040816   0 0.0000000 
9  576546  0 0.005494505   0  0 
10 576546  0 0.005494505   0  0 
11 576546  0 0.005494505   0  0 
12 576546  0 0.005494505   0  0 
13 576546  0 0.005494505   0  0 
14 576546  0 0.005494505   0  0 
15 576546  0 0.005494505   0  0 
16 576546  0 0.005494505   0  0 
17 576546  1 0.005917160   0  1 
18 576546  1 0.005917160   0  1 
19 576546  1 0.005917160   0  0 
20 576546  1 0.005917160   0  0 
21 576546  1 0.005917160   0  0 
22 576546  1 0.005917160   0  0 

我真的希望能尽可能高效。

+0

什么包是'graph'而来? – CPak

+0

igraph。谢谢 – kkjoe

+0

我已经编辑了包信息内的代码,谢谢 – kkjoe

回答

1

你的榜样数据

df <- data.frame(npi_one=seq(1,19,2), 
       npi_two=seq(2,20,2), 
       hee_provn1=c(rep(175221,4),rep(576546,3),rep(789535,3))) 

除了igraph你需要tidyverse

library(tidyverse) 
library(igraph) 

我已经注释下面的代码以匹配您的原代码

final <- df %>% 
     group_by(hee_provn1) %>%  # similar to filter(df, hee_provn1 == '175221') 
     nest() %>%     # similar to df2 [,c("npi_one","npi_two")] 
     mutate(data=map(data,~c(apply(.x,1,c)))) %>% # similar to c(apply(df3,1,c)) 
     mutate(data=map(data,~graph(.x,directed=F))) %>% # similar to graph(l,directed = FALSE) 
     mutate(data=map(data,~ data.frame(degree = degree(.x), 
              closeness = closeness(.x), 
              betweenness = betweenness(.x), 
              eigen_centrality = eigen_centrality(.x)$vector))) %>% # similar to making b, c, d, e individually 
     unnest(data) # revert to normal data frame 

输出head(final)

hee_provn1 degree closeness betweenness eigen_centrality 
1  175221  1 0.020408163   0  1.000000e+00 
2  175221  1 0.020408163   0  1.000000e+00 
3  175221  1 0.020408163   0  0.000000e+00 
4  175221  1 0.020408163   0  0.000000e+00 

注意我每次运行eigen_centrality我得到不同的值,所以一定要确保它返回预期的值

+0

您可以通过接受答案来关闭此问题,左边的复选标记 – CPak