matrix - 如何在 Julia 中创建关联矩阵

标签 matrix julia

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

id x  y   
A  22   2   
B   4  21   
C  21 360   
D  26   2   
E  22  58   
F   2 347   

我想要一个矩阵(没有列名和行名):
  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   

我已经开始这样的代码:
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)

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

任何可以帮助我的建议?

谢谢!

最佳答案

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

data,header = readcsv("data.csv",header=true);
# get the column names by looking at unique values in columns
cols = unique(vec([(header[j+1],data[i,j+1]) for i in 1:size(data,1),j=1:2]))
# row names from ID column
rows = data[:,1]

using NamedArrays
narr = NamedArray(zeros(Int,length(rows),length(cols)),(rows,cols),("id","attr"));
# now stamp in the 1s in the right places
for r=1:size(data,1),c=2:size(data,2) narr[data[r,1],(header[c],data[r,c])] = 1 ; end

现在我们有了(注意我转置了 narr 以获得更好的打印输出):
julia> narr'
10x6 NamedArray{Int64,2}:
attr ╲ id │ A  B  C  D  E  F
──────────┼─────────────────
("x",22)  │ 1  0  0  0  1  0
("x",4)   │ 0  1  0  0  0  0
("x",21)  │ 0  0  1  0  0  0
("x",26)  │ 0  0  0  1  0  0
("x",2)   │ 0  0  0  0  0  1
("y",2)   │ 1  0  0  1  0  0
("y",21)  │ 0  1  0  0  0  0
("y",360) │ 0  0  1  0  0  0
("y",58)  │ 0  0  0  0  1  0
("y",347) │ 0  0  0  0  0  1

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

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

如果应该忽略值的列,即 x=2 和 y=2 都应该在列上为值 2 设置 1,则代码变为:
using NamedArrays
data,header = readcsv("data.csv",header=true);
rows = data[:,1]
cols = map(string,sort(unique(vec(data[:,2:end]))))
narr = NamedArray(zeros(Int,length(rows),length(cols)),(rows,cols),("id","attr"));
for r=1:size(data,1),c=2:size(data,2) narr[data[r,1],string(data[r,c])] = 1 ; end

给予:
julia> narr
6x8 NamedArray{Int64,2}:
id ╲ attr │   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

关于matrix - 如何在 Julia 中创建关联矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37797937/

相关文章:

c++ - 性能问题 : Inverting an array of pointers in-place vs array of values

graphics - 正确的缩放和旋转转换设置

julia - REQUIRE 文件位于 Julia 的什么位置?

julia - 列出 JuMP 中可用的求解器

unicode - 为什么 Poodle 和浴缸,而不是下标大写字母? (Julia 中的 Unicode)

macros - 为什么 Julia 中的字符串宏使用...?

r - 获取矩阵的最后一个元素

R 相当于 Matlab 对 Schur 分解的重新排序?

c - 使用 C 程序从 txt 文件中读取坐标

multidimensional-array - Julia:制作自定义类型的空/初始化多维数组