【发布时间】:2017-08-02 15:00:23
【问题描述】:
我在 R 中有一个数据框 df,这里是它的前 6 行。
df <- data.frame (npi_one = c('n1487','n1952','n1952','n1467','n1467','n1538'),
npi_two = c('n1467','n1467','n1487','n1508','n1538','n1508'),
weight = c(1,1,2,1,1,1),
hee_provn1=c(rep(015171,3),rep(015443,3)))
我想按hee_provn1分组,然后做一个循环,第一个循环的代码是:
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: 15171 n1487 2 0.3333333 0.0 1.0000000
2: 15171 n1467 2 0.5000000 0.5 0.7320508
3: 15171 n1952 2 0.3333333 0.0 1.0000000
而第二个循环的结果表(hee_provn1 == 015171)是
hee_provn1 npi degree closeness betweenness eigen
1: 15443 n1467 2 0.5 0 1
2: 15443 n1508 2 0.5 0 1
3: 15443 n1538 2 0.5 0 1
我是 R 新手,我不知道如何根据数据框的一列进行分组和循环。
另外,我希望我的最终结果是一个大表,将所有表放在一起,例如:
hee_provn1 npi degree closeness betweenness eigen
1: 15171 n1487 2 0.3333333 0.0 1.0000000
2: 15171 n1467 2 0.5000000 0.5 0.7320508
3: 15171 n1952 2 0.3333333 0.0 1.0000000
4: 15443 n1467 2 0.5 0 1
5: 15443 n1508 2 0.5 0 1
6: 15443 n1538 2 0.5 0 1
由于某种原因,我不能使用 R 包 tidyverse,谢谢
我尝试了 Balter 的方法,
df <- data.frame (npi_one = c('n1487','n1952','n1952','n1467','n1467','n1538'),
npi_two = c('n1467','n1467','n1487','n1508','n1538','n1508'),
weight = c(1,1,2,1,1,1),
hee_provn1=c(rep(015171,3),rep(015443,3)))
library(igraph)
library(dplyr)
library(data.table)
final.df <- c()
for(x in unique(df$hee_provn1)){
df2 <- subset(df, subset = hee_provn1 == x)
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
result <- data.frame(d,c,b,e)
setDT(result, keep.rownames = TRUE)[]
setnames(result,1,"npi")
cbind(hee_provn1 = x,result)
final.df <- rbind(final.df, result)
}
colnames(final.df) <- c('npi','degree', 'closeness','betweenness','eigen')
结果是:
npi degree closeness betweenness eigen
1: n1487 2 0.3333333 0.0 1.0000000
2: n1467 2 0.5000000 0.5 0.7320508
3: n1952 2 0.3333333 0.0 1.0000000
4: n1467 2 0.5000000 0.0 1.0000000
5: n1508 2 0.5000000 0.0 1.0000000
6: n1538 2 0.5000000 0.0 1.0000000
看起来与我的理想结果不同,如何成功跟踪哪个迭代产生了它?
【问题讨论】:
-
您可以在
result中添加一列。result <- data.frame(x,d,c,b,e)因为x是您要细分的内容。不要忘记更改最后一行:colnames(final.df) <- c('hee_provn1','npi','degree', 'closeness','betweenness','eigen') -
仅供参考,您的
cbind(hee_provn1 = x,result)行不执行任何操作。您需要分配结果。只有特殊的set*函数在不分配结果的情况下工作。此外,在 R 中,在循环中动态增长的东西效率很低。R Inferno 是一个很好的指南,可以很好地解决像这样的陷阱burns-stat.com/documents/books/the-r-inferno