3

我在 csv 文件中有一个大的(200 列/行)邻接矩阵。这详细说明了个人之间的互动。我想将此文件转换为边缘列表,可以手动完成,但会花费大量时间。

数据的一小部分如下所示(第一个单元格是空格):

        A   B   C   
    A   0   0   1   
    B   0   0   1   
    C   1   0   0   

我想把它变成这样:

    A  1  C
    B  1  C
    C  1  A

这只是示例数据。基本上我想要的是绘制这些节点如何交互,并从中绘制这些交互的网络。我在 R 包 PCIT 中尝试了以下代码,但它返回错误:

    install.packages("PCIT")
    library(PCIT)
    input=read.csv('mouse.csv',header=TRUE,row.names=1,check.names=FALSE)
    setwd('/Users/Plosslab/Documents/PythonStuff')
    getEdgeList(input, rm.zero=TRUE)

但我收到以下错误:

    Error in structure(.Internal(as.vector(x, "double")), Csingle = TRUE) : 
    (list) object cannot be coerced to type 'double'
4

2 回答 2

3

获取数据:

m <- as.matrix(read.table(text="
     A   B   C   D
    A   0   0   0   1
    B   0   0   1   0
    C   1   0   0   1",
   header=TRUE))

怎么样

w <- which(m==1,arr.ind=TRUE)
data.frame(r=rownames(m)[w[,"row"]],
           i=1,
           c=colnames(m)[w[,"col"]])
##   r i c
## 1 C 1 A
## 2 B 1 C
## 3 A 1 D
## 4 C 1 D

(你在乎订单吗……?)

PCIT无论如何假设对称,所以这对你来说可能是个问题。

于 2015-04-11T20:06:34.687 回答
2
with open('input.csv') as infile:
    infile.readline()
    for row in csv.reader(infile, delimiter='\t'):
        src = row[0]
        weights = [int(i) for i in row[1:]]
        for dest, weight in zip("ABC", weights):
            if not weight: continue
            print(src, weight, dest)
于 2015-04-11T20:33:49.563 回答