从二维中提取图形

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()