创建多个网络并在R

时间:2017-07-11 16:23:40

标签: r loops igraph

我目前正在研究公司联锁,我想分析他们在不同年份之间的联系。到目前为止,我已经调查了我的数据并创建了一个包含多个属性的边缘列表,其中一个属性是它们连接的时间。以下是一些示例数据:

sample <- data.frame(ID = 1:8, org_ID = c(5,4,1,2,2,2,5,7), mon = c("1998m1", "1998m2","1998m2","1998m2","1999m4","1999m12","2000m1", "2000m12"))
library(igraph)

我使用grep命令将数据分组为数年,因为这将是我分析的基础:

yr1998 <- grep('1998', unique(sample$mon), value=TRUE)
yr1999 <- grep('1999', unique(sample$mon), value=TRUE)
yr2000 <- grep('2000', unique(sample$mon), value=TRUE)

我的原始数据包含15年,我将计算多个指标。我想创建一个循环,下面显示的代码将在1998年到2012年的分析中经历所有年份。我猜测如果我得到一般的想法,我可以添加更多的度量并绘制我的图形而无需重写每次这个 - 据我所知,这是循环背后的原理,这听起来非常方便。 : - )

##Create graph per year:
# 1998
df.1998 <- sample[sample$mon %in% yr1998,]
g.1998 <- graph.data.frame(d = df.1998, directed = TRUE)
g.1998 <- simplify(df.1998, remove.multiple = FALSE, remove.loops = TRUE)
E(g.1998)$weight <- count_multiple(g.1998)
g.1998

#calculate values
centralization.degree(g.1998)
g.1998$betweenness <- betweenness(g.1998)

我已经读过for循环和lapply函数,但是既不能为我想要的东西工作。请注意,这是我在R的第一个项目,我更习惯在Stata工作,但我非常渴望学习。

旁注:如果有更优雅的方式将数据分组为15个图表,我也很感兴趣。我的第一次尝试是将每个数据框架分组,但现在我的研究范围已经变为几年而不是几个月。出于某种原因,我设法在那里写了一个工作循环。

# subsetting into monthly data
#for(j in unique(sample$mon)) {
#  yr <- paste("sample", j, sep = ".")
#  assign(yr, sample[sample$mon==j,])
#}

提前感谢您花时间阅读本文和任何答案。

1 个答案:

答案 0 :(得分:1)

这应生成一个列表,其中包含每年数据的图表。

library(igraph)

sample <- data.frame(ID = 1:8, 
                     org_ID = c(5,4,1,2,2,2,5,7), 
                     mon = c("1998m1", "1998m2","1998m2","1998m2","1999m4","1999m12","2000m1", "2000m12"))

# Add a column for the year
sample$year <- substr(sample$mon, 1, 4)

# Create a function to generate a graph
get.graphs <- function(df){
  g <- graph.data.frame(d = df, directed = TRUE)
  g <- simplify(g, remove.multiple = FALSE, remove.loops = TRUE)
  E(g)$weight <- count_multiple(g)
  g

  #calculate values
  centralization.degree(g)
  g$betweenness <- betweenness(g)

  return(g)
}

# Get a list of dataframes by year
df.list <- split(sample, sample$year)

# Create a list of graphs for each year
graph.list <- lapply(df.list, get.graphs)

# Access an individual graph
graph.list$`1999`