我想创建一个关联矩阵.
我有一个包含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)
现在的问题是我不知道如何在特定列中填充矩阵,如上例所示.
我也不确定我是否走在正确的道路上.
任何可以帮助我的建议?
谢谢!
NamedArrays是一个简洁的包,它允许命名行和列,并且似乎适合这个问题。假设数据在data.csv,这是一种解决方法(NamedArrays使用进行安装Pkg.add("NamedArrays")):
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\nRun Code Online (Sandbox Code Playgroud)\n\n现在我们有了(注意我转置了narr以获得更好的打印输出):
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\nRun Code Online (Sandbox Code Playgroud)\n\n但是,如果DataFrames有必要,应该应用类似的技巧。
- - - - - 更新 - - - - -
\n\n如果应忽略某个值的列,即 x=2 和 y=2 均应在值 2 的列上设置 1,则代码将变为:
\n\nusing 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\nRun Code Online (Sandbox Code Playgroud)\n\n给予:
\n\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n