如何在Julia中创建关联矩阵

god*_*nes 5 matrix julia

我想创建一个关联矩阵.
我有一个包含3列的文件,例如:

id x  y   
A  22   2   
B   4  21   
C  21 360   
D  26   2   
E  22  58   
F   2 347   
Run Code Online (Sandbox Code Playgroud)

我想要一个矩阵(没有col和row名称):

  2 4 21 22 26 58 347 360   
A 1 0  0  1  0  0   0   0   
B 0 1  1  0  0  0   0   0   
C 0 0  1  0  0  0   0   1   
D 1 0  0  0  1  0   0   0   
E 0 0  0  1  0  1   0   0   
F 1 0  0  0  0  0   1   0   
Run Code Online (Sandbox Code Playgroud)

我已经启动了代码:

haps = readdlm("File.txt",header=true)      
hap1_2 = map(Int64,haps[1][:,2:end])    
ID = (haps[1][:,1])                      
dic1 = Dict()

for (i in 1:21)
    dic1[ID[i]] = hap1_2[i,:]
end

X=[zeros(21,22)];       #the original file has 21 rows and 22 columns 
X1 = hcat(ID,X)
Run Code Online (Sandbox Code Playgroud)

现在的问题是我不知道如何在特定列中填充矩阵,如上例所示.
我也不确定我是否走在正确的道路上.

任何可以帮助我的建议?

谢谢!

Dan*_*etz 2

NamedArrays是一个简洁的包,它允许命名行和列,并且似乎适合这个问题。假设数据在data.csv,这是一种解决方法(NamedArrays使用进行安装Pkg.add("NamedArrays")):

\n\n
data,header = readcsv("data.csv",header=true);\n# get the column names by looking at unique values in columns\ncols = unique(vec([(header[j+1],data[i,j+1]) for i in 1:size(data,1),j=1:2]))\n# row names from ID column\nrows = data[:,1]\n\nusing NamedArrays\nnarr = NamedArray(zeros(Int,length(rows),length(cols)),(rows,cols),("id","attr"));\n# now stamp in the 1s in the right places\nfor r=1:size(data,1),c=2:size(data,2) narr[data[r,1],(header[c],data[r,c])] = 1 ; end\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我们有了(注意我转置了narr以获得更好的打印输出):

\n\n
julia> narr\'\n10x6 NamedArray{Int64,2}:\nattr \xe2\x95\xb2 id \xe2\x94\x82 A  B  C  D  E  F\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n("x",22)  \xe2\x94\x82 1  0  0  0  1  0\n("x",4)   \xe2\x94\x82 0  1  0  0  0  0\n("x",21)  \xe2\x94\x82 0  0  1  0  0  0\n("x",26)  \xe2\x94\x82 0  0  0  1  0  0\n("x",2)   \xe2\x94\x82 0  0  0  0  0  1\n("y",2)   \xe2\x94\x82 1  0  0  1  0  0\n("y",21)  \xe2\x94\x82 0  1  0  0  0  0\n("y",360) \xe2\x94\x82 0  0  1  0  0  0\n("y",58)  \xe2\x94\x82 0  0  0  0  1  0\n("y",347) \xe2\x94\x82 0  0  0  0  0  1\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,如果DataFrames有必要,应该应用类似的技巧。

\n\n

- - - - - 更新 - - - - -

\n\n

如果应忽略某个值的列,即 x=2 和 y=2 均应在值 2 的列上设置 1,则代码将变为:

\n\n
using NamedArrays\ndata,header = readcsv("data.csv",header=true);\nrows = data[:,1]\ncols = map(string,sort(unique(vec(data[:,2:end]))))\nnarr = NamedArray(zeros(Int,length(rows),length(cols)),(rows,cols),("id","attr"));\nfor r=1:size(data,1),c=2:size(data,2) narr[data[r,1],string(data[r,c])] = 1 ; end\n
Run Code Online (Sandbox Code Playgroud)\n\n

给予:

\n\n
julia> narr\n6x8 NamedArray{Int64,2}:\nid \xe2\x95\xb2 attr \xe2\x94\x82   2    4   21   22   26   58  347  360\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\nA         \xe2\x94\x82   1    0    0    1    0    0    0    0\nB         \xe2\x94\x82   0    1    1    0    0    0    0    0\nC         \xe2\x94\x82   0    0    1    0    0    0    0    1\nD         \xe2\x94\x82   1    0    0    0    1    0    0    0\nE         \xe2\x94\x82   0    0    0    1    0    1    0    0\nF         \xe2\x94\x82   1    0    0    0    0    0    1    0\n
Run Code Online (Sandbox Code Playgroud)\n