首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用R创建关系矩阵

用R创建关系矩阵
EN

Stack Overflow用户
提问于 2015-06-04 13:25:53
回答 1查看 204关注 0票数 2

我的数据包括参与项目的不同个人的项目,以及项目实施的年份。

如何为每年创建一个nxn关系矩阵(n是个体的数量)来统计个人之间的协作数。

考虑以下再现所需结构的示例:

代码语言:javascript
复制
# Example dataframe
set.seed(1)
tp=cbind(paste(rep("project",10),1:10,sep=""),sample(2005:2010,10,replace=T))
tp=tp[sample(1:10,50,T),]
id=sample(paste(rep("id",10),1:10,sep=""),50,T)
df=as.data.frame(cbind(tp,id));rm(tp,id)
names(df)=c("project","year","id")
df=df[order(df$project,df$id),]

df[1:10,]
# project  year id
# project1 2006 id1
# project1 2006 id3
# project1 2006 id5
# project1 2006 id5
# project4 2006 id3
# project4 2006 id4
# project5 2006 id3
# project5 2006 id4
# project6 2008 id2
# project6 2008 id3

例如,2006年的关系矩阵如下所示

代码语言:javascript
复制
    id1 id2 id3 id4 id5
id1  0   0   1   0   1
id2  0   0   0   0   0
id3  1   0   0   2   1
id4  0   0   2   0   0
id5  1   0   1   0   0

# link between 1 and 3, 1 and 5, 3 and 5 on project 1
# links between 3 and 4 on project 4 and project 5
# the matrix is symmetric
# the diagonal is O because an individual cannot collaborate with himself
EN

回答 1

Stack Overflow用户

发布于 2015-06-04 14:54:33

您还可以将dplyr与tidyr一起用于以下内容:

代码语言:javascript
复制
library(dplyr)
library(tidyr)

df %>%
  unique %>%
  mutate(val = 1) %>%
  spread(id, val) %>%
  select(-project) %>%
  group_by(year) %>%
  do({
    mat <- select(., -year) %>% as.matrix
    mat[is.na(mat)] <- 0
    cp <- crossprod(mat)
    diag(cp) <- 0
    cp %>% as.data.frame %>%
      add_rownames(var = 'id')
  }) %>%
  ungroup
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30645066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档