拥有这些数据:
keyword1 keyword2 keyword3
art1 0 1 0
art2 1 1 0
art3 0 0 1
可以使用以下方法提取图表:
library(igraph)
df1<-data.frame(keyword1=c(0,1,0),keyword2=c(1,1,0),keyword3=c(0,0,1),row.names=c("art1","art2","art3"))
df1.mt <- as.matrix(df1)
df1.adj <- t(df1.mt) %*% df1.mt
diag(df1.adj) <- 0
g <- graph.adjacency(df1.adj)
plot(g)
如果数据具有以下格式:
keyword1 keyword2 keyword3
artA 0 1 0
artA 1 1 0
artB 0 0 1
artB 1 1 0
artC 1 1 0
如何提取图表?
答案 0 :(得分:0)
这是一个函数,它采用二进制矩阵并为列创建邻接矩阵,其中两列被认为是相邻的,如果对于某些行,这些列中的两个条目都是1:
adj.matrix <- function(B){
n <- ncol(B)
g <- expand.grid(1:n,1:n)
adj <- apply(g,MARGIN = 1, FUN = function(v){max(pmin(B[,v[1]],B[,v[2]]))})
dim(adj) <- c(n,n)
diag(adj) <- 0
colnames(adj) <- colnames(B)
row.names(adj) <- colnames(B)
graph.adjacency(adj)
}
测试它:
B <- rbind(c(1,1,0,0,0),
c(0,0,1,1,0),
c(0,0,0,1,1),
c(0,0,1,0,1))
colnames(B) <- c("A","B","C","D","E")
g <- adj.matrix(B)
plot(g)
结果图:
我不是100%确定你打算用第二种格式做什么。看起来您的第二种格式是以下格式的数据框:
df <- data.frame(names=c("artA","artA","artB","artB","artC"),keyword1=c(0,1,0,1,1),keyword2=c(1,1,0,1,1),keyword3=c(0,0,1,0,0))
是:
names keyword1 keyword2 keyword3
1 artA 0 1 0
2 artA 1 1 0
3 artB 0 0 1
4 artC 1 1 0
5 artC 1 1 0
您可以通过适当使用aggregate
将其用于适合上述功能的格式:
> df <- aggregate(. ~ names,data = df, max)
> row.names(df) <- as.character(df$names)
> df$names <- NULL
> df
keyword1 keyword2 keyword3
artA 1 1 0
artB 1 1 1
artC 1 1 0
在此阶段,df
看起来就像是您的第一个表格,而as.matrix(df)
可能会被投放到函数adj.matrix()