Reemplazo de valores de matriz¡Hola! Estoy tratando de ingresar todos los datos de mis columnas en una matriz de 8 por 12 en orden (completando las columnas primero hacia abajo). Solo hay 72 valores en mi columna, por lo que quiero que los valores restantes que no estén completados sean 0.Tengo muchos problemas al intentar que funcione el siguiente código. ¡Apreciaría cualquier ayuda!
dt = Open("Example.jmp");<BR />Rows = nrows(dt);
names= dt << Get Column Names (String);
Table =[];
Table = J(8,12,0);
For(i=1, i <= ncol(dt),i++,
data = column(dt, names[i]) <<GETVALUES></GETVALUES>Re: Reemplazo de valores de matriz¡Gracias! esto funciona perfectamenteRe: Reemplazo de valores de matrizNo tengo su ejemplo, así que tuve que usar una de las tablas de datos de muestra de JMP. Reemplace esas líneas de la tabla de datos inicial con las suyas propias.
Names Default to Here( 1 );
// use sample data to illustrate
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
// delete non-numeric data columns
dt << Delete Columns( { :Name, :Sex } );
// make empty container
table = Associative Array();
// get each data column and create (key, value) pair (key = col name, value = 8x12 matrix)
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
If( N Row( data ) < 96,
data |/= J( 96 - N Row( data ), 1, 0 );
);
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
Close( dt, No Save );
dir = Get Default Directory();
content = table << Get Contents;
For( t = 1, t <= N Items( content ), t++,
dt = As Table( content[t][2] );
file path = dir || content[t][1] || ".CSV";
dt << Save( file path );
Close( dt, No Save );
text = Load Text File( file path );
eol = Contains( text, "\!n" );
text = Munger( text, 1, eol - 1, content[t][1] );
Save Text File( file path, text );
);Re: Reemplazo de valores de matrizMuchas gracias por tu ayuda. Te lo agradezco. Pude guardar el archivo usando su código, pero actualmente la primera fila del archivo csv es la primera línea de datos, no hay ningún nombre de columna. Me gustaría que la primera celda tenga el nombre de la columna y justo debajo los datos de 8 por 12.Re: Reemplazo de valores de matrizPor favor sea paciente. Tengo dificultades para guardar el archivo CSV por algún motivo desconocido. Estoy trabajando con soporte técnico.
Mientras espero que respondan, quiero estar seguro de que desea reemplazar la primera fila del archivo CSV (encabezados de las columnas de datos originales) con solo el nombre de la columna de datos original.
Re: Reemplazo de valores de matriz¡¡Esto funcionó!! Sin embargo, en realidad quería mantener los nombres de las columnas (o en este caso el contenido [t] [1]) en el archivo csv como primera línea. Actualmente no se muestra. ¿Sabes cómo puedo guardarlo en la primera celda del archivo csv?Re: Reemplazo de valores de matrizOk, esta versión actualizada del script debería funcionar:
Names Default to Here( 1 );
dt = Open( "Example.jmp" );
table = Associative Array();
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
If( N Row( data ) < 96,
data |/= J( 96 - N Row( data ), 1, 0 );
);
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
content = table << Get Contents;
For( t = 1, t <= N Items( content ), t++,
dt = As Table( content[t][2] );
Close( dt, Save( content[t][1] || ".CSV" ) );
);
Lamentablemente, no sé cómo suprimir la primera línea con los nombres de los encabezados en los archivos CSV. Quizás alguien más lo sepa. Inmediatamente podríamos volver a leer el archivo como texto, eliminar la primera línea y guardarlo nuevamente.
Re: Reemplazo de valores de matrizNecesito el diseño para mi configuración y un archivo csv es el único tipo de archivo que lee el dispositivoRe: Reemplazo de valores de matrizConsulte Ayuda > Índice de secuencias de comandos. Haga clic en el botón desplegable y seleccione Funciones. Busque la función Como tabla().
Re: Reemplazo de valores de matrizSospecho que, como nuevo usuario de JMP, es posible que su mentalidad siga siendo la de un usuario de hojas de cálculo. No sé el destino del archivo CSV, pero puedes hacer muchas cosas en JMP usando un diseño de tabla alta.
¿Por qué necesitas el diseño de 8x12? ¿Por qué es necesario exportar las matrices como archivos CSV?
Podríamos ayudarle a utilizar JMP a su favor si supiéramos hacia dónde se dirige este análisis.
Re: Reemplazo de valores de matrizPor favor echa un vistazo a esta publicación . Puede que te resulte útil en tu trabajo con experimentos sobre placas.
Re: Reemplazo de valores de matrizPuede que sea un poco redundante, pero aquí hay una forma alternativa de manejar esto dado el requisito de generar un archivo csv.Utiliza la manipulación de la tabla de datos para obtener los datos en el formato correcto y luego escribe la tabla de datos en un archivo csv.
Names Default To Here( 1 );
// Create some sample data
dt = New Table( "Example",
add rows( 72 ),
New Column( "c1", formula( Random Uniform( 1, 500 ) ) ),
New Column( "c2", formula( Random Uniform( 1, 500 ) ) ),
New Column( "c3", formula( Random Uniform( 1, 500 ) ) )
);
dt << run formulas;
dt:c1 << delete property( "formula" );
dt:c2 << delete property( "formula" );
dt:c3 << delete property( "formula" );
// Get the list of columns
colNamesList = dt << get column names( string, numeric );
// Loop across the columns and process them
For( i = 1, i <= N Cols( dt ), i++,
// Create a new table will only the single column
dtTemp = dt << subset(invisible, selected rows( 0 ), columns( Column( colNamesList[i] ) ) );
// If there are not 96 rows, add them
If( N Rows( dtTemp ) < 96,
rowCount = N Rows( dt );
dtTemp << add rows( 96 - rowCount );
For( k = rowCount + 1, K <= 96, k++,
Column( dtTemp, colNamesList[i] )[k] = 0
);
);
// Create a sequence column to allow for proper splitting of the data
dtTemp << New Column( "sequence",
formula(
x = Mod( Row(), 8 );
If( x == 0, x = 8 );
x;
)
);
dtTemp << run formulas;
// Split the data into 8 columns.....if this should be 12 just change the sequence formula above
dtSplit = dtTemp << Split(invisible, Split By( :sequence ), Split( Column( dtTemp, colNamesList[i] ) ), Sort by Column Property );
dtSplit << run formulas;
// Close the un needed temporary data table
Close( dtTemp, nosave );
// Change the output preferences to get rid of headers
current_pref = Char( Arg( Parse( (Char( Get Preferences( Export settings ) )) ), 1 ) );
// Set prefs (comma delimited, no headers)
Pref( Export Settings( End Of Field( Comma ), Export Table Headers( 0 ) ) );
// Save csv file
dtSplit << save( "$TEMP\" || colNamesList[i] || ".csv" );
//Restore oribinal prefs
Eval( Parse( "pref(" || current_pref || ")" ) );
// Close the un necessary table
Close( dtSplit, nosave );
);
Re: Reemplazo de valores de matrizGracias por su ayuda e interés. El método de matriz asociativa de Mark Bailey ha funcionado. Ahora estoy tratando de descubrir cómo colocar la matriz asociativa en una tabla de datos para poder exportarla como un archivo CSV.Re: Reemplazo de valores de matrizEntonces, una vez que tienes los datos en las matrices, ¿cómo los mueves a las ubicaciones permanentes?Re: Reemplazo de valores de matrizMe disculpo por la confusión. Estoy tratando de almacenar cada uno de los datos de mi columna en un formato de 8 por 12 (que es el tamaño de una placa de microtitulación con 96 pocillos), para almacenar los resultados de mis experimentos en correlación con su ubicación en la placa. . Cada columna representa un experimento diferente.Re: Reemplazo de valores de matrizHe estado siguiendo esta discusión desde el principio.Parece haber evolucionado hasta convertirse en un ejercicio de guión, sin exponer cuál es el verdadero objetivo final. @Mark_Bailey ha proporcionado una buena solución con el uso de una matriz asociativa, pero lo que veo que falta es ¿cuál es la verdadera razón para crear estas matrices?Si se supiera esto, podría haber una solución más sencilla.
Re: Reemplazo de valores de matrizLos nombres de las columnas se almacenan en la matriz asociativa. Son las claves. Puede verificar esta afirmación agregando esto al script:
Show( table << Get Keys );
Le sugiero que vea Ayuda > Libros > Guía de secuencias de comandos y luego busque 'matriz asociativa'. Puede iterar sobre los pares y realizar muchas otras tareas fácilmente. Los ejemplos de la guía son buenos, pero regrese aquí si tiene alguna pregunta.
Re: Reemplazo de valores de matriz¡¡Gracias!! Esto funciona bien. Sin embargo, el nombre de la columna no se almacena. ¿Sabes cómo podría solucionar eso?Re: Reemplazo de valores de matriz¿Sus columnas de datos son para los resultados de una placa de microtitulación?
Quiere remodelar los datos de cada columna en una tabla de 8x12. Su script solo mantendrá la tabla de la última columna. Aquí hay un script que procesa cada columna de datos y almacena el resultado de la tabla con el nombre de la columna en una matriz asociativa.
Names Default to Here( 1 );
dt = Open( "Example.jmp" );
table = Associative Array();
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
data[Loc(Is Missing( data ))] = 0;
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
Show( table << Get Contents );
Supongo que tienes al menos 96 filas. Si hay más, se pierden. Si hay menos, entonces la asignación de 0 debe cambiarse a una concatenación que rellene con 0. Esta versión rellena en su lugar:
Names Default to Here( 1 );
dt = Open( "Example.jmp" );
table = Associative Array();
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
If( N Row( data ) < 96,
data |/= J( 96 - N Row( data ), 1, 0 );
)
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
Show( table << Get Contents );
Re: Reemplazo de valores de matriz¡Gracias por su ayuda! ¿Puedo utilizar la función Obtener como matriz para colocar los datos en una matriz con especificaciones? Necesito que los datos de la columna entren en una matriz de 8 por 12.Re: Reemplazo de valores de matrizgracias por la respuesta Jim! La tabla de datos tiene 5 columnas en este momento, pero puede cambiar según la entrada del usuario. Básicamente estoy tratando de poner una columna de datos en una matriz con 12 columnas y 8 filas.
(a - 1) * b + b no parece funcionar para mí, supongo que porque para los datos de la primera columna siempre serán datos [0]. ¿Sabes qué va mal?Re: Reemplazo de valores de matrizJim ofrece una muy buena solución, pero tampoco estoy seguro de lo que quieres hacer, así que te ofrezco otra forma de ilustrar otro punto.
Names Default to Here( 1 );
// open example
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
// make illustrative example with colums of different sizes (missing values)
dt2 = dt1 << Split(
Split By( :age ),
Split( :weight ),
Remaining Columns( Drop All ),
Sort by Column Property
);
Close( dt1, No Save );
// input data table as matrix
mat = dt2 << Get As Matrix;
// replace missing values with zero
mat[Loc(Is Missing(mat))] = 0;
// see result
Show( mat );
Espero eso ayude.
Re: Reemplazo de valores de matrizRealmente no estoy seguro de entender lo que estás tratando de hacer.Pero a continuación se muestra un script que llenará ceros después de que la matriz llamada datos se quede sin valores.
dt = Open( "Example.jmp" );
Rows = N Rows( dt );
names = dt << Get Column Names( String );
Table = [];
Table = J( 8, 12, 0 );
For( i = 1, i <= N Col( dt ), i++,
data = Column( dt, names[i] ) << getValues;
For( a = 1, a <= 12, a++,
For( b = 1, b <= 8, b++,
// I believe that (a - 1 ) * b + b will be equal to the
// row number of the data matrix you read in. Once it's
// value is greater than the number of rows in the dt data
// table, it will enter zeros.
If( (a - 1) * b + b <= Rows,
Table[a, b] = data[(a - 1) * b + b],
Table[a, b] = 0
)
)
);
);
Print( Table );
Estoy confundido acerca de lo que estás haciendo con el bucle For() externo, yendo de una columna a otra.¿Cuántas columnas hay en la tabla de datos de ejemplo?