NamedArrays
は、行と列の両方に名前を付けることができ、この問題の請求書に適合しているようなきれいなパッケージです。データがdata.csv
であるとし、ここではそれについて移動する一つの方法は、(Pkg.add("NamedArrays")
と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
が必要な場合は、同様のトリックを適用する必要があります。
---------- ---------- UPDATE
値の列、すなわち、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
DataFramesパッケージの 'ModelFrame()'と 'ModelMatrix()'関数を調べましたか?彼らはあなたが必要とする機能を持っている可能性があります。スパース行列を作成するためのsparse()関数もあります(これは作成しようとしているものです)。それはここではうまくいくが、実装するのが少し複雑だ。 –
インシデンス行列の意図的なx = 2とy = 2の同じ列ですか? –
IntやBoolのような単一の特定の型のインシデンス行列を保持し、文字列であるラベルに混在させないことは、型推論と効率の方がずっと優れています。 –