rimuovere le colonne duplicateCIAO:
Ho un'enorme tabella di dati con oltre 400 colonne e 50.000 righe. Ho 30-40 colonne duplicate e vorrei rimuoverle dalla mia tabella di dati. qualche idea?
Ri: rimuovere le colonne duplicateEcco un'alternativa di forza bruta (e non testata) che può o non può essere "migliore" per l'uso previsto:
NamesDefaultToHere(1);
dt = CurrentDataTable();
// Make a matrix 'mat' holding pairwise equality of column values
n = NCol(dt);
mat = J(n, n, .);
for(c1 = 1, c1 <=n, c1++,
for(c2 = c1+1, c2 <= n, c2++,
c1Vals = Column(dt, c1) << getValues;
c2Vals = Column(dt, c2) << getValues;
mat[c1, c2] = all(c1Vals == c2Vals);
);
);
// Convert 'mat' to a table
cols = dt << getColumnNames("String");
dtn = dt << getName;
dt2 = AsTable(mat, << columnNames(cols));
dt2 << setName("Duplicate Columns in "||dtn);
dt2 << NewColumn("Column", Character, Values(cols));
dt2 << moveSelectedColumns({"Column"}, ToFirst);Ri: rimuovere le colonne duplicatePuoi usare un Somma di controllo MD5 , generato dal Blocco MD5() funzione per generare un hash dei valori in una colonna e quindi confrontare i checksum tra le colonne.
È possibile utilizzare un array associativo per verificare la presenza di checksum md5 duplicati man mano che vengono generati per evitare di dover confrontare personalmente ogni checksum con ogni altro checksum.
dt = New Table( "Some Duplicate Columns",
Add Rows( 1000 ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ), Formula( Random Normal() ) ),
New Column( "Copy of Column 1", Numeric, "Continuous", Format( "Best", 12 ), Formula( :Column 1 ) ),
New Column( "Not a copy of Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( If( Row() == 1, 1, :Column 1 ) )
),
New Column( "Character copy of Column 1", Character, "Nominal", Formula( Char( :Column 1 ) ) ),
New Column( "Character copy of Copy of Column 1",
Character,
"Nominal",
Formula( Char( :Copy of Column 1 ) ),
)
);
//get values into matrix (numeric columns) or list (character columns)
c1 = :column 1 << get values;
c2 = :Copy of Column 1 << get values;
//avoid having to check column data types when converting the values to blob
//by converting matrix or list to character
//
//if you're not lazy you could use the Matrix to Blob() function for numeric columns
//and the Char to Blob() function for character columns
char_c1 = Char( c1 );
char_c2 = Char( c2 );
c1_md5 = Blob MD5( Char To Blob( char_c1 ) );
c2_md5 = Blob MD5( Char To Blob( char_c2 ) );
Show( c1_md5 == c2_md5 );
//check the whole data table using hex version of md5 as keys of associative array
aa = Associative Array();
For( i = 1, i <= N Col( dt ), i++,
md5 = Hex( Blob MD5( Char To Blob( Char( Column( dt, i ) << get values ) ) ) );
//check to see if the associate array already has a key named with this md5
If( aa << Contains( md5 ),
//aa does contain md5
Print( aa[md5] || " is a duplicate of " || (Column( dt, i ) << get name) ),
//aa does not contain md5
//store a key named with this md5 with a value of the column name
aa[md5] = Column( dt, i ) << get name;
);
);
Ri: rimuovere le colonne duplicatePerché hai così tante colonne duplicate? Questo risultato può essere evitato?
Ri: rimuovere le colonne duplicateCIAO,
Incontro lo stesso problema oggi, ed ecco il mio script per rimuovere le colonne duplicate.
Ci vuole davvero tempo se hai una tabella con più di migliaia di righe. Dovrebbe esserci un modo più efficiente per farlo, spero che qualcuno possa capirlo e condividerlo.
Names Default To Here( 1 );
col_name = dt << get column names;
dup_col = {}; //store the duplicated column name
same_c = 0; //to record how many rows are the same while doing columns comparison
/* When the elements are the same in the same row for 2 columns, same_c will be added by 1*/
/*If the same_c is equal to the total row number, then the 2 columns are the same. Insert the column name into dup_col*/
For( i = 1, i <= (N Cols( dt ) - 1), i++,
For( k = i + 1, k <= N Cols( dt ), k++,
(For Each Row( If( :(col_name[i])[Row()] == :(col_name[k])[Row()], same_c++, Wait( 0 ) ) ) ;
If( same_c == N Rows( dt ), Insert Into( dup_col, col_name[k] ), Wait( 0 )) ;
same_c = 0 ; )
)
);
dt << Delete Column( Eval( dup_col ) );
// delete the duplicated columns
Ri: rimuovere le colonne duplicateNon sono a conoscenza di alcun metodo JMP integrato per farlo. Tuttavia, puoi utilizzare la statistica RSquare per determinare se le colonne sono identiche.
Se hai intenzione di farlo in modo interattivo, le colonne continue possono essere identificate utilizzando
Analizza==>Metodi multivariati==>Multivariati
Ti darà una matrice di corellazione che puoi generare in una tabella di dati e quindi usarla per identificare quali colonne hanno una correlazione di 1.
Le colonne ordinali/nominali possono essere identificate creando una "Make Combined Data Table" dalla tabella RSquare in Fit Y by X. Ancora una volta, un RSquadro di 1.0 ti darà l'indizio che le colonne sono identiche.
Ora, se hai intenzione di creare uno script per una soluzione, quanto sopra può essere automatizzato abbastanza facilmente.
Forse un altro membro della comunità avrà una soluzione migliore