我正在做一个社交网络分析任务,需要从矩阵中创建一个网络。我正在尝试创建一个矩阵来显示人们的共同点。
我的原始数据如下所示:
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 任何关于我哪里出了错以及如何解决这个错误的建议,以获得显示学生通过课程联系的正确矩阵,都将不胜感激。谢谢!
发布于 2018-01-23 01:36:17
因此,如果您需要一个矩阵来显示具有共享类的个人-您可以利用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命令可删除重复的连接和回路。
然后我们确定节点类型(类/个体):
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)
https://stackoverflow.com/questions/47935418
复制相似问题