Entfernen Sie doppelte SpaltenHallo:
Ich habe eine riesige Datentabelle mit über 400 Spalten und 50.000 Zeilen. Ich habe 30-40 doppelte Spalten und möchte sie aus meiner Datentabelle entfernen. irgendwelche Ideen?
Betreff: Doppelte Spalten entfernenHier ist eine brachiale (und ungetestete) Alternative, die für den beabsichtigten Zweck „besser“ sein kann oder auch nicht:
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);Betreff: Doppelte Spalten entfernenSie können eine verwenden MD5-Prüfsumme , erzeugt durch die Klecks MD5() Funktion, um einen Hash der Werte in einer Spalte zu generieren und dann Prüfsummen über Spalten hinweg zu vergleichen.
Sie können ein assoziatives Array verwenden, um nach doppelten md5-Prüfsummen zu suchen, während sie generiert werden, um zu vermeiden, dass Sie jede Prüfsumme mit jeder anderen Prüfsumme selbst vergleichen müssen.
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;
);
);
Betreff: Doppelte Spalten entfernenWarum haben Sie so viele doppelte Spalten? Kann dieses Ergebnis verhindert werden?
Betreff: Doppelte Spalten entfernenHallo,
Ich habe heute das gleiche Problem, und hier ist mein Skript zum Entfernen der doppelten Spalten.
Es braucht wirklich Zeit, wenn Sie eine Tabelle mit über Tausenden von Zeilen haben. Es sollte einen effizienteren Weg geben, hoffe, jemand kann es herausfinden und teilen.
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
Betreff: Doppelte Spalten entfernenMir ist keine integrierte JMP-Methode bekannt, um dies zu tun. Sie können jedoch die RSquare-Statistik verwenden, um festzustellen, ob die Spalten identisch sind.
Wenn Sie dies interaktiv tun, können die fortlaufenden Spalten mit identifiziert werden
Analysieren==>Multivariate Methoden==>Multivariat
Sie erhalten eine Korrelationsmatrix, die Sie in eine Datentabelle ausgeben können, und verwenden Sie sie dann, um zu identifizieren, welche Spalten eine Korrelation von 1 haben.
Die ordinalen/nominalen Spalten können identifiziert werden, indem eine „Kombinierte Datentabelle erstellen“ aus der RSquare-Tabelle in Y nach X anpassen erstellt wird. Auch hier gibt Ihnen ein RSquare von 1,0 den Hinweis, dass die Spalten identisch sind.
Wenn Sie nun eine Lösung skripten, kann das Obige ziemlich einfach automatisiert werden.
Vielleicht hat ein anderes Community-Mitglied eine bessere Lösung