Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónLamento publicar esto nuevamente. He publicado fragmentos de mi flujo de trabajo, enmascarados, aquí, para pedir ayuda, y todavía tengo dificultades. Tengo dificultades para verificar las respuestas, ya que he tenido malas experiencias en StackOverflow, donde me gritaban y cosas así sin ningún motivo real. Estoy seguro de que las cicatrices se curarán con el tiempo. De todos modos, estoy aquí y eventualmente responderé tus respuestas.
Para llegar al punto técnico:
Estoy intentando copiar las fechas en las que se analizaron algunas muestras (cada muestra debería haberse analizado en 3 ocasiones distintas, suponiendo que todo salió bien durante la parte de laboratorio del proyecto, en la que no estuve presente) en tres columnas independientes de un archivo de manifiesto que realiza un seguimiento de los metadatos en curso de nuestro proyecto, según lo que he podido deducir, de modo que cada columna sea una instancia de recopilación de datos. Hay varios donantes, cada uno con una identificación de donante, y cierta redundancia en los datos, como varios canales de recopilación en el instrumento para el "mismo punto de datos" (depende de cómo se mire), aunque creo que debería ser eso.
Aquí está el pseudocódigo con el que he estado intentando trabajar y hasta ahora ha sido complicado. No sé por qué. No soy un informático, desarrollador o ingeniero de software experimentado. Agradezco cualquier ayuda.
DataTypes:
(associative array) DonorID{
(key) Month1: (value) date1 (empty at start)
(key) Month2: (value) date2 (empty at start)
(key) Month3: (value) date3 (empty at start)
}
find unique donor IDs in data
for each donor ID{
get (i.e. subset) data keyed on donor ID;
for Month in 1, 2, 3 (strings){
if no date in donorID associative array{
add date from data;
}else if date already{
is the date in the data table cell the same as in the associative array entry?
if yes, do nothing (indicates different target channel)
if no, ping user
Multiple run dates for same data point is a problem.
}
}
}
Copy from data to manifest:
loop over DonorID associative array:
for each donorID:
in Month 1, 2, or 3:
add date1 2 or 3 to "Actual Month [1, 2, or 3] Stability Test Date" in manifest
donorID is still row identifier
date (1, 2, or 3) is now column identifier
Combinación y limpieza de datosRe: Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónAhora estoy tratando de asignar los datos/fechas al archivo de manifiesto en las filas con las identificaciones correctas:
... );
//write(LBCM_array);
dt_manifest << Get Rows Where(dt_manifest:ID Number for Updating Table == ID)[:Actual Data 1 Date] = data_array["data1"];
//repeat for data 2 & 3
);
que, en realidad, todavía no tengo idea de cómo hacerlo desde JSL como principiante, así que me sale el error
["data1" => {}, "data2" => {}, "data3" => {}]
attempting to assign to an object that is not an L-value in access or evaluation of 'Assign' , dt_manifest << Get Rows Where(
dt_manifest:ID Number for Updating Table == ID
)[:Actual Data 1 Date] = /*###*/data_array["data1"] /*###*/No tengo idea de lo que esto significa.
Gracias,
Miguel
Re: Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónLo de abajo me funciona...
Names Default To Here( 1 );
dt_data = Open("...");
Summarize( dt_data, IDs = by(dt_data:ID)); //this finds all the unique donor IDs in the data file, which we will need
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest data file.
For(i = 1, i <= N Items(IDs), i++,
ID = num(IDs[i]); //the type conversion here is important, or else a key-value call in the associative array below doesn't work
data_array = Associative Array( {"data1", "data2", "data3"}, {{}, {}, {}} ); //it appears in the print statements we get 3 copies, indicating this loop works
For( data = data_array << First, !Is Empty( data ), data = data_array << Next( data ), //looping through data_array's keys is clunky but done this way in JMP
data_array[data] = dt_data:Run date[dt_data << Get rows Where(:ID == ID & :Timepoint == data)]
);
);excepto que ahora tengo varias copias de cada entrada de datos (punto de fecha y hora) en data_array. Me pregunto cómo limpiar eso, hacer solo una copia de cada fecha/dato en data_array.
He estado probando una declaración if, usando una declaración As Date() para comparar y formatear las fechas para la comparación y la entrada para asegurarme de que solo obtengamos un valor único. Pero eso me ha dado problemas hasta ahora (es decir, la matriz se convierte en un error o se vacía nuevamente).
Sin embargo, estoy muy contento con el progreso hasta ahora.
@txnelson : Lo siento, me gusta tu método y gracias por tu ayuda, pero notarás que pude fandangle sin tu técnica de indexación "k"
. (Me pregunto cómo funciona su método cuando hay varias fechas del mismo valor, ¿qué es lo que tengo en mi caso?)
@brady_brady : Tenga en cuenta que he implementado identificadores de tablas de datos antes de que la columna llame cuando corresponda. Gracias por enseñarme este concepto básico; Me moría de curiosidad al respecto y busqué en Google sin fin sin ningún resultado hasta ahora.
Miguel
Re: Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónHola a todos. Estoy progresando, en realidad, por una vez, en lugar de estar atascado en algo sin saber en qué dirección ir.
En este momento, uno de mis pares clave/valor no encaja, por lo que obtengo resultados incorrectos de una de mis llamadas a la matriz. Estoy tratando de depurar esto para poder subdividir/filtrar la tabla de datos correctamente hasta lo que quiero transferir a la matriz asociativa.
Muchas gracias por toda tu ayuda.
MiguelRe: Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónGracias, Brady. Todo eso tiene sentido para mí.
Parece que algunas de esas cosas eran, de hecho, problemas en mi código. Me he dirigido a ellos y me dirijo a lo largo. Tengo nuevos problemas que publicaré una vez que los resuelva un poco.
Miguel
Re: Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónHola Jim. Gracias por la respuesta. ¿Te importaría explicar en inglés humano cómo funciona tu código? Mi interpretación es: todas las filas donde la ID es única se colocan en theRows. Luego, se instancia un índice k.Se incrementa dentro del ciclo donde las fechas de ejecución se agregan a la matriz de datos.Dentro de este ciclo, ahora, en lugar de lo que tenía antes, cada valor único en theRows se usa como un índice para acceder a :Run date y ese resultado se completa en la matriz de datos.
Esto tendría sentido para mí si lo estudiara más tiempo. No es demasiado claro a primera vista. No estoy seguro. Pero explica al final de su publicación con una conclusión de una línea.
Después de reemplazar todas las variables borradas con mis variables reales en mi código, aparece el error:
invalid subscript (must be number or list of numbers) in access or evaluation of 'theRows[k]' , theRows[/*###*/k]
y no se porque
Todavía estoy confundido y continuaré estudiando este fragmento de código. Es extraño, he tomado una buena cantidad de clases de codificación en la universidad, pero no he mantenido mi base de conocimientos, así que supongo que podría haberse erosionado con el tiempo.
¡Gracias por tu ayuda!
Miguel
PD: En cuanto a por qué matrices asociativas: pensé que sería una forma eficiente de transferir datos como un principiante de JMP con experiencia más similar a Java/Python. ¿Recomendaría manipular directamente las tablas? Sin embargo, estoy tan avanzado en esta ruta que me pregunto si sería completamente interesante completar la tarea en cuestión de esta manera.
Re: Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónHola,
Usted escribe:
Mi problema es con esta línea en este momento:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Veo un par de posibles problemas... asegúrese de examinar estos:
1) :Fecha de ejecución, tal como está escrito, se refiere a una columna en cualquier tabla de datos que esté vigente en el momento en que se interprete esta línea de código. Parece del mensaje de error que en el momento de la interpretación de esta línea de código, la tabla de datos actual no contiene una columna llamada "Fecha de ejecución". Veo que abres dos mesas; siempre asegúrese de que la tabla deseada sea de hecho la tabla actual, si deja que JMP elija qué tabla usar. Puede forzar cualquier tabla que desee para que sea la tabla actual, utilizando el comando Tabla de datos actual:
dt1 = open("firstfile");
dt2 = open("secondfile");
Current Data Table (dt1); // sets first table current
Current Data Table (dt2); //sets second table current
Sin embargo, no es necesario dejar que JMP decida. Puede especificar explícitamente la tabla que se utilizará, actual o no, mediante un tabla:columna formato, como en:
dt1:Run Date
2) Una vez que solucione el problema de la moneda de la tabla, deberá usar el << obtener filas donde ( ) mensaje, enviado a la tabla de datos correspondiente, para devolver filas que cumplen algunos criterios. A menudo, estos se utilizan como índices, como en su caso. Suponiendo que desea trabajar con dt1, el código aparecerá como:
data_array[data] = dt1:Run Date[dt1 << Get rows Where(:ID == ID & :Timepoint == data)];
Esta línea hace 3 trabajos:
1) Obtiene las filas en dt1 que cumplen algunos criterios, devolviéndolas en un vector. Tenga en cuenta que debido a que el << obtener filas donde() se envía un mensaje a dt1, se entiende que :ID y :Timepoint también están en dt1.
2) Utiliza el vector devuelto en el paso 1 anterior como índices para dt1: Fecha de ejecución, que es la columna Fecha de ejecución en dt1. Debido a que hemos delimitado explícitamente la Fecha de ejecución a la tabla dt1 mediante dt1: Fecha de ejecución, no importa si dt1 es la tabla actual o no. La finalización de este segundo paso devuelve un vector de valores, exactamente los que queremos, de la columna Fecha de ejecución.
3) Asigna el vector de valores de fecha de ejecución devueltos en el paso 2 anterior como el valor de una clave específica, datos, en la matriz asociativa, matriz_datos .
Salud,
Brady
Re: Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónMiguel,
Sigo un poco perdido sobre por qué desea usar una matriz asociativa, pero independientemente, creo que el código a continuación se moverá a la matriz, los valores de fecha para las 3 filas de medición para cada ID.Inventé algunos datos que espero se parezcan al diseño de sus datos.Solo estoy adivinando según sus declaraciones y el uso del código.

Aquí está el guión.La tabla de datos anterior se genera al comienzo de la secuencia de comandos, por lo que las entrañas de su código, con mis modificaciones, se encuentran debajo de la generación de la tabla de datos.
Names Default To Here( 1 );
dt_data = New Table( "Example",
Add Rows( 6 ),
New Column( "ID", Character, "Nominal", Set Values( {"A", "A", "A", "B", "B", "B"} ) ),
New Column( "Run Date",
Numeric,
"Continuous",
Format( "m/d/y", 12 ),
Input Format( "m/d/y" ),
Set Values( [3692304000, 3694982400, 3697401600, 3700080000, 3702672000, 3705350400] )
),
New Column( "TimePoint", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [., ., ., ., ., .] ) )
);
//dt_manifest = Open( "[filepath, no issues here]" );
Summarize( dt_data, IDs = by( :ID ) ); //this finds all the unique IDs in the data file, which we will need //[no issues here]
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest file.
For( i = 1, i <= N Items( IDs ), i++,
ID = IDs[i];
theRows = dt_data << get rows where( :ID == ID );
data_array = Associative Array( {"data1", "data2", "data3"}, {{}, {}, {}} );
k=0;
For( data = data_array << First, !Is Empty( data ), data = data_array << Next( data ), //looping through data_array's keys is clunky but done this way in JMP
k++;
show( ID ); //just a check; works
data_array[data] = :Run date[theRows[k]];
//...continue with further code to transfer from LBCM_array to manifest
);
show(data_array);
);
Los resultados del código se enumeran en el registro.
ID = "A";
ID = "A";
ID = "A";
data_array = ["data1" => 3692304000, "data2" => 3694982400, "data3" => 3697401600];
ID = "B";
ID = "B";
ID = "B";
data_array = ["data1" => 3700080000, "data2" => 3702672000, "data3" => 3705350400];
Los números en data_array son los valores numéricos para las fechas de ejecución.
Re: Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónHola a todos. Aquí está mi código hasta ahora:
Names Default To Here( 1 );
dt_data = Open( "[filepath, no issues here]" );
dt_manifest = Open( "[filepath, no issues here]" );
Summarize( dt_data, IDs = by( :ID ) ); //this finds all the unique IDs in the data file, which we will need //[no issues here]
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest file.
For( i = 1, i <= N Items( IDs ), i++,
ID = IDs[i];
data_array = Associative Array( {"data1", "data2", "data3"}, {{}, {}, {}} ); //it appears in the print statements we get 3 copies, indicating this loop works
For( data = data_array << First, !Is Empty( data ), data = data_array << Next( data ), //looping through data_array's keys is clunky but done this way in JMP
Write( ID ); //just a check; works
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data); //does not work
//...continue with further code to transfer from LBCM_array to manifest
);
);Lo he limpiado para que sea confidencial (no se preocupe por espiar la información corporativa;)) mientras retengo la estructura y la información (nombre 'a' nombre, etiqueta a etiqueta).
Mi problema es con esta línea en este momento:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Lanza el mensaje de error
.
Name Unresolved: Run date in access or evaluation of 'Run date' , :Run date/*###*/
In the following script, error marked by /*###*/
...
data_array[data] = :Run date/*###*/ <<WHERE></WHERE>
:La fecha de ejecución es una columna de datos (encabezado) en mi tabla de datos (específicamente, dt_data) con fechas de ejecución de experimentos. Estoy tratando de transferirlos al segundo archivo, ya que cada punto de datos debería haberse recopilado tres o tres veces y es por eso que data_array tiene tres claves y tres valores vacíos cuando se inicializa. Aquí es donde van los datos, esta matriz asociativa (data_array). Luego se transfiere a dt_manifest pero eso es para más adelante, una vez que esta parte esté funcionando.
Por ahora parece que tengo problemas para acceder, en la línea
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
la selección adecuada de filas y columnas que me interesan. ¿La declaración del problema es lo suficientemente clara en este momento para que cualquier persona de la audiencia intervenga y ofrezca una solución o contribución sobre cómo especificar de una manera más sintácticamente (y posiblemente semánticamente) correcta cómo seleccionar el subconjunto de datos que estoy interesado en (de data_dt)?
No te preocupes por el tema de la transposición. Me ocuparé de eso más adelante y, sinceramente, creo que debería ser bastante fácil una vez que los datos estén en una aa (matriz asociativa). En este punto, todavía estoy aprendiendo a manipular selecciones de filas/columnas, subconjuntos de tablas de datos, etc., problemas relacionados.
Una nota más: si parece extraño que las fechas, los datos y las matrices se mezclen, probablemente se deba a que elegí nombres inadecuados para los títulos/etiquetas de depuración/anonimización de las columnas de datos o entidades de datos relevantes para mantener seguros los secretos de mi empresa. Diría que todavía soy un novato en todo este proceso, y prefiero errar por el lado seguro.
Seguiré trabajando en el problema desde mi punto de vista.
Muchas gracias,
Miguel
Re: Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónGracias, Brady.Re: Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónHola,
¡Bienvenido a la comunidad! Lamento que hayas tenido experiencias negativas en otros tableros al pedir ayuda. Si bien la comunidad de usuarios de JMP es un lugar acogedor y útil, existen algunas "mejores prácticas" que deberían maximizar sus posibilidades de obtener la información que busca.
Hacer preguntas específicas, vice más generales, es el camino a seguir si puede lograrlo, aunque me doy cuenta de que a veces uno "no sabe lo que no sabe". Publicar una parte considerable de pseudocódigo puede ahuyentar a la gente... si no puede hacer su pregunta de otra manera, será de gran ayuda adjuntar un archivo de "antes" y "después" (y capturas de pantalla) para que los espectadores tengan una idea concreta. ejemplos de una tabla de "inicio" (o datos de texto) y una tabla de "finalización". Esto definitivamente marcaría una diferencia real en este caso particular. Si tiene que "desinfectar" los conjuntos de datos, está bien (lo mejor, de verdad). Siempre y cuando el punto que está tratando de ilustrar todavía se pueda hacer, todo está bien.
Si hace preguntas específicas y bien dirigidas e incluye archivos ilustrativos y capturas de pantalla, es probable que muchos de los que se encuentran aquí se interpongan para ayudarlo. ¡Puedo pensar en más de unos pocos que realmente no pueden resistir eso!
Salud,
Brady