NamedArrays
è un pacchetto ordinato che consente di denominare sia righe che colonne e sembra adattarsi alla bolletta per questo problema. Supponiamo che i dati sono in data.csv
, qui è un metodo per andare su di esso (installazione NamedArrays
con Pkg.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
ora abbiamo (nota che ho recepito narr
per una migliore stampa):
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
Ma , se sono necessari DataFrames
, si dovrebbero applicare trucchi simili.
---------- ---------- UPDATE
Nel caso la colonna di un valore deve essere ignorato cioè x = 2 e Y = 2 dovrebbe impostati un 1 su colonna per il valore 2, quindi il codice diventa:
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
dono:
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
Avete esaminato le funzioni 'ModelFrame()' e 'ModelMatrix()' nel pacchetto DataFrames? Potrebbero avere la funzionalità di cui hai bisogno. Esiste anche la funzione sparse() per la creazione di matrici sparse (che è ciò che stai cercando di creare). Funzionerebbe qui, ma è un po 'più complicato da implementare. –
La colonna identica per x = 2 e y = 2 nella matrice di incidenza è intenzionale? –
È molto meglio per l'inferenza di tipo e l'efficienza mantenere la matrice di incidenza di un singolo tipo specifico, come Int o Bool, e non mescolare le etichette che sono stringhe. –