eliminar columnas duplicadasHola:
Tengo una tabla de datos de hugue con más de 400 columnas y 50,000 filas. Tengo unas 30-40 columnas duplicadas y me gustaría eliminarlas de mi tabla de datos. ¿algunas ideas?
Re: eliminar columnas duplicadasAquí hay una alternativa de fuerza bruta (y no probada) que puede o no ser 'mejor' para el 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);Re: eliminar columnas duplicadasPuedes usar un Suma de control MD5 , generado por el Blob MD5 () función para generar un hash de los valores en una columna y luego comparar sumas de comprobación entre columnas.
Puede usar una matriz asociativa para comprobar si hay sumas de comprobación md5 duplicadas a medida que se generan para evitar tener que comparar cada suma de comprobación con cada otra suma de comprobación.
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: eliminar columnas duplicadas¿Por qué tienes tantas columnas duplicadas? ¿Se puede prevenir este resultado?
Re: eliminar columnas duplicadasHola,
Hoy encuentro el mismo problema, y aquí está mi script para eliminar las columnas duplicadas.
Realmente lleva tiempo si tiene una tabla con más de miles de filas. Debe haber una forma más eficiente de hacerlo, espero que alguien pueda resolverlo y compartirlo.
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: eliminar columnas duplicadasNo tengo conocimiento de ningún método JMP incorporado para hacer esto. Sin embargo, puede utilizar la estadística RSquare para determinar si las columnas son idénticas.
Si va a hacer esto de manera interactiva, las columnas continuas se pueden identificar usando
Analizar ==> Métodos multivariados ==> Multivariados
Le dará una matriz de correlación que puede generar en una tabla de datos y luego la usará para identificar qué columnas tienen una correlación de 1.
Las columnas ordinales / nominales se pueden identificar creando una "Crear tabla de datos combinados" a partir de la tabla de RSquare en Fit Y by X. Una vez más, un RSquare de 1.0 le dará la pista de que las columnas son idénticas.
Ahora, si va a escribir una solución, lo anterior se puede automatizar con bastante facilidad.
Quizás otro miembro de la comunidad tenga una mejor solución.