Mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónLo siento por publicar esto de nuevo. He publicado fragmentos de mi flujo de trabajo, enmascarados, aquí, en busca de ayuda, y todavía estoy luchando. Tengo dificultades para verificar las respuestas porque he tenido malas experiencias en las que me gritaron StackOverflow y cosas por el estilo sin una razón real. Estoy seguro de que las cicatrices se curarán con el tiempo. De todos modos, estoy cerca y llegaré a sus respuestas eventualmente.
Para llegar al punto técnico:
Estoy tratando de copiar las fechas en que se ejecutaron algunas muestras (cada muestra debería haberse ejecutado en 3 ocasiones distintas, suponiendo que todo salió bien durante la parte de laboratorio del proyecto, para la que no estuve presente) en tres columnas separadas de un archivo de manifiesto. que realiza un seguimiento de los metadatos en curso para nuestro proyecto, a partir de lo que he recopilado, de modo que cada columna es 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 múltiples 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 así.
Aquí está mi pseudocódigo con el que he estado tratando de trabajar y hasta ahora ha sido difícil. No sé por qué. No soy un científico informático, desarrollador o ingeniero de software experimentado. Se agradece 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 identifierScriptingRe: mover un subconjunto de datos de una tabla a las columnas de una segunda tabla con una transposiciónHola,
¡Bienvenidos a la comunidad! Lamento que hayas tenido experiencias negativas en otros foros 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, viceversa, es el camino a seguir si puedes lograrlo, aunque me doy cuenta de que a veces uno "no sabe lo que no sabe". Publicar una cantidad considerable de pseudocódigo puede asustar a la gente ... si no puede hacer su pregunta de ninguna otra manera, será de gran ayuda adjuntar un archivo "antes" y "después", y capturas de pantalla, para que los espectadores tengan información concreta. ejemplos de una tabla de "inicio" (o datos de texto) y una tabla de "fin". Definitivamente, esto marcaría una diferencia real en este caso particular. Si tiene que "desinfectar" los conjuntos de datos, está bien (lo mejor, en realidad). Siempre y cuando el punto que está tratando de ilustrar aún se pueda establecer, todo está bien.
Si hace preguntas específicas y bien orientadas e incluye archivos ilustrativos y capturas de pantalla, es probable que muchos de los que están aquí se unan para ayudar. ¡Puedo pensar en más de unos pocos que no pueden resistirse a eso!
Salud,
Brady
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 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 borré para que sea confidencial (no te preocupes por espiar información corporativa;)) mientras conservo 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);
Arroja 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 las fechas de ejecución del experimento. 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. ¿Es el enunciado del problema lo suficientemente claro en este momento para que cualquier persona de la audiencia se ofrezca 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 soy? interesado en (de data_dt)?
No se preocupe por el problema de la transposición. Me ocuparé de eso más tarde, y creo que, honestamente, debería ser bastante fácil una vez que los datos estén en un 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 estén mezclando, probablemente se deba a que elegí nombres deficientes 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. Todavía soy un novato en todo este proceso, diría yo, y prefiero errar por el lado seguro.
Continuaré 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ónMiguel,
Sigo perdido un poco sobre por qué desea usar una matriz asociativa, pero independientemente, creo que el siguiente código 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 asemejen 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 del script, por lo que las entrañas de su código, con mis modificaciones, vienen 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 de data_array son los valores numéricos de 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,
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 problemas potenciales ... asegúrese de investigar estos:
1): Fecha de ejecución, como está escrito, se refiere a una columna en la tabla de datos que sea actual en el momento en que se interpreta esta línea de código. Parece por el 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; Asegúrese siempre de que la tabla deseada sea de hecho la tabla actual, si deja a JMP 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 que lo decida JMP. Puede especificar explícitamente la tabla que se utilizará, actual o no, utilizando un tabla: columna formato, como en:
dt1:Run Date
2) Una vez que solucione el problema de la moneda de la mesa, deberá utilizar el << obtener filas donde () mensaje, enviado a la tabla de datos apropiada, para devolver filas que cumplen con 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 y las devuelve en un vector. Tenga en cuenta que debido a que << obtener filas donde () se envía el 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 asignado explícitamente el alcance de la Fecha de ejecución a la tabla dt1 usando 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, data_array .
Salud,
Brady
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 el ID es único se colocan en las filas. Luego, se crea una instancia de 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 las filas se usa como un índice para acceder: Fecha de ejecución y ese resultado se completa en la matriz de datos.
Esto tendría sentido para mí si lo estudiara más tiempo. No está demasiado claro a primera vista. No estoy seguro. Pero lo explica al final de su publicación con una conclusión de una línea.
Después de reemplazar todas las variables eliminadas 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 sé por qué.
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 principiante de JMP con experiencia más en la línea de Java / Python. ¿Recomendarías manipular directamente las tablas? Sin embargo, estoy tan lejos 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ó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 sigo adelante. Tengo nuevos problemas que publicaré una vez que los resuelva un poco.
Miguel