我正在进行社交网络分析工作,需要从矩阵创建网络。我试图创建一个矩阵,显示人们的共同点。
我的原始数据如下所示:
Last.Name <- c("A", "B", "C", "D")
email <- c("abdn@gmail.com", "anfgd@gmail.com", "ahdg@gmail.com", "resd@gmail.com)
Class.1 <- c("ABC101", "ABC364", "ABC103", "ABC354")
Class.2 <- c("ABC201", "ABC204", "ABC207", "ABC624")
Class.3 <- c("ABC223", "ABC267", "ABC103", "ABC354")
我已经将原始数据纠缠到矩阵中并需要转置它但得到以下错误:
Error in M1 %*% t(M1) : requires numeric/complex matrix/vector arguments
这是我到目前为止所做的:
library(tidyr)
D1$classes <- 1
D2<- D1 %>% gather(Class.1:Class.6, key = "number", value = "class-names")
D3<- spread(D2, key= "class-names", value= "classes")
D3$email <- NULL
M1 <- as.matrix(D3)
M1[is.na(M1)] <- 0
M2 <- t(M1)
M3 <- M1 %*% t(M1)
之前的SO问题/回答R error message when using t()%*% “requires numeric/complex matrix/vector arguments建议使用以下代码,但我收到相同的错误消息。
df2 %>% mutate_if(is.factor, as.character) -> df2
m <- as.matrix(df2)
m2 <- t(m) %*% m
对于我出错的地方以及如何解决此错误以获得显示通过课程连接的学生的正确矩阵的任何建议将不胜感激。谢谢!
答案 0 :(得分:0)
因此,如果您需要一个显示共享类个体的矩阵 - 您可以使用igraph包,创建个人类的双模网络,然后将其投影到两个单模式网络(i)类分享参与者和(ii)分享课程的个人。
创建数据框(我只是使用姓氏来识别个人)
library(tidyr)
library(igraph)
DF<-cbind(Last.Name,Class.1,Class.2,Class.3)%>%as.data.frame(.,stringsAsFactors=FALSE)
D2<- DF %>% gather(Class.1:Class.3, key = "number", value = "class-names")
我忽略了班级编号(我不确定该编号在您的问题中扮演的角色)并专注于班级代码:
D2$number<-NULL
然后,我们可以从这个数据框创建双模式的个人网络:
g<- graph_from_data_frame(D2, directed=FALSE)
plot(g)
g2<-simplify(g, remove.multiple = TRUE, remove.loops = TRUE)
simplify命令删除重复的tie和循环。
然后我们确定节点类型(类/个体):
V(g2)$type<-V(g2)$name %in% unique(DF$Last.Name)
然后我们可以将这种双模网络投射到两个单模网络中:
PROJECTION<-bipartite.projection(g2) #two-mode
CLASSnet<-PROJECTION[[1]] #one-mode
INDnet<-PROJECTION[[2]]#one-mode
然后我们可以使用以下方法从共享类的个人网络中提取矩阵:
INDmat<-as_adjacency_matrix(INDnet)
INDmat<-as.matrix(INDmat)