从二维中提取图形
Extracting a graph from 2 dimension
有这个数据:
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
如何提取图表?
这是一个函数,它接受一个二进制矩阵并为列创建一个邻接矩阵,其中如果对于某行,这些列中的两个条目都是 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
你可以通过 suitable 使用 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
看起来像您的第一个 table,并且 as.matrix(df)
可以提供给函数 adj.matrix()
有这个数据:
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
如何提取图表?
这是一个函数,它接受一个二进制矩阵并为列创建一个邻接矩阵,其中如果对于某行,这些列中的两个条目都是 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
你可以通过 suitable 使用 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
看起来像您的第一个 table,并且 as.matrix(df)
可以提供给函数 adj.matrix()