supprimer les colonnes en doubleSalut:
J'ai une énorme table de données avec plus de 400 colonnes et 50 000 lignes. J'ai 30 à 40 colonnes en double et je voudrais les supprimer de ma table de données. des idées?
Re : supprimer les colonnes en doubleVoici une alternative à la force brute (et non testée) qui peut ou non être "meilleure" pour l'utilisation prévue :
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);Re : supprimer les colonnes en doubleVous pouvez utiliser un Somme de contrôle MD5 , généré par le Blob MD5() pour générer un hachage des valeurs d'une colonne, puis comparer les sommes de contrôle entre les colonnes.
Vous pouvez utiliser un tableau associatif pour vérifier les sommes de contrôle md5 en double lorsqu'elles sont générées pour éviter d'avoir à comparer vous-même chaque somme de contrôle avec toutes les autres sommes de contrôle.
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;
);
);
Re : supprimer les colonnes en doublePourquoi avez-vous autant de colonnes en double ? Ce résultat peut-il être évité ?
Re : supprimer les colonnes en doubleSalut,
Je rencontre le même problème aujourd'hui, et voici mon script pour supprimer les colonnes dupliquées.
Cela prend vraiment du temps si vous avez une table avec plus de milliers de lignes. Il devrait y avoir un moyen plus efficace de le faire, j'espère que quelqu'un pourra le comprendre et le partager.
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
Re : supprimer les colonnes en doubleJe ne connais aucune méthode JMP intégrée pour ce faire. Cependant, vous pouvez utiliser la statistique RSquare pour déterminer si les colonnes sont identiques.
Si vous allez le faire de manière interactive, les colonnes continues peuvent être identifiées en utilisant
Analyser==>Méthodes multivariées==>Multivarié
Il vous donnera une matrice de corrélation que vous pouvez générer dans une table de données, puis l'utiliser pour identifier les colonnes ayant une corrélation de 1.
Les colonnes ordinales/nominales peuvent être identifiées en créant un "Make Combined Data Table" à partir de la table RSquare dans Fit Y by X. Encore une fois, un RSquare de 1.0 vous donnera l'indice que les colonnes sont identiques.
Maintenant, si vous allez créer un script pour une solution, ce qui précède peut être assez facilement automatisé.
Peut-être qu'un autre membre de la communauté aura une meilleure solution