1

テーブル内の一致する列の値からエッジを作成したいので、基本的には次のとおりです。

   V1  V2  V3
A  1    1   0
B  1    0   1
C  0    1   1
D  1    0   1

そのようなテーブルがあった場合、エッジリストを作成したいと思います

A - B
A - D
A - C
B - C
B - D

そのため、列の値が行ごとに一致するたびにエッジを作成したいと思います。私は多くのドキュメントに目を通しましたが、これと似たようなことをするものを見つけられないようです。どんな助けでも大歓迎です!

4

4 に答える 4

2

あなたのデータで使用した後、「igraph」パッケージを試してみcrossprodます。data.frameあなたが「mydf」と呼ばれると仮定します:

out <- crossprod(t(mydf))
out[lower.tri(out, diag=TRUE)] <- 0

library(igraph)
g <- graph.adjacency(out)
get.edgelist(g)
#      [,1] [,2]
# [1,] "A"  "B" 
# [2,] "A"  "C" 
# [3,] "A"  "D" 
# [4,] "B"  "C" 
# [5,] "B"  "D" 
# [6,] "B"  "D" 
# [7,] "C"  "D" 

重複したくない場合は、次を使用できます。

g <- graph.adjacency(out > 0)
get.edgelist(g)
于 2013-11-19T16:30:58.577 に答える
1

これを試して:

#dummy data
df <- read.table(text="
A 1 1 0
B 1 0 1
C 0 1 1
D 1 0 1",sep=" ", as.is=TRUE)

#get names where 1 per column
lst <- sapply(2:ncol(df), function(j)
  df[df[,j]==1,1])
#make combinations
lst_comb <- sapply(1:(ncol(df)-1), function(i)
  combn(lst[[i]],2))
#output
matrix(sort(unique(
  unlist(
    sapply(1:length(lst_comb),function(i){
      x <- t(lst_comb[[i]])
      paste0(x[,1],"-",x[,2])
      })))))

#     [,1]  
#[1,] "A-B"
#[2,] "A-C"
#[3,] "A-D"
#[4,] "B-C"
#[5,] "B-D"
#[6,] "C-D"
于 2013-11-19T14:21:14.850 に答える