Spostamento di un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneMi dispiace per aver postato di nuovo questo messaggio. Ho postato frammenti del mio flusso di lavoro, mascherati, qui, per chiedere aiuto, e sto ancora lottando. Ho difficoltà a controllare le risposte perché ho avuto brutte esperienze su StackOverflow che è stato urlato e così via senza una vera ragione. Sono sicuro che le cicatrici guariranno con il tempo. Ad ogni modo, sono in giro e alla fine arriverò alle tue risposte.
Per arrivare al punto tecnico:
Sto cercando di copiare le date in cui sono stati eseguiti alcuni campioni (ogni campione avrebbe dovuto essere eseguito in 3 occasioni separate supponendo che tutto sia andato bene durante la parte di laboratorio del progetto, per cui non ero in giro) in tre colonne separate di un file manifest che tiene traccia dei metadati in corso per il nostro progetto, da ciò che ho raccolto, in modo tale che ogni colonna sia un'istanza di raccolta dati. Ci sono più donatori ciascuno con un ID donatore e una certa ridondanza nei dati come più canali di raccolta sullo strumento per lo "stesso punto dati" (dipende da come lo si guarda), anche se penso che dovrebbe essere così.
Ecco il mio pseudocodice su cui ho cercato di elaborare e finora è stato difficile. Non so perché Non sono uno scienziato informatico esperto, uno sviluppatore o un ingegnere del software. Qualsiasi aiuto è apprezzato.
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 identifierScriptingOggetto: spostamento di un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneCiao,
Benvenuto nella community! Mi dispiace che tu abbia avuto esperienze negative su altre bacheche quando hai chiesto aiuto. Sebbene la comunità di utenti di JMP sia un luogo accogliente e utile, esistono alcune "best practice" che dovrebbero massimizzare le tue possibilità di ottenere le informazioni che cerchi.
Chiedere domande specifiche, viceversa più generali, è la strada da percorrere se riesci a farcela, anche se mi rendo conto che a volte uno "non sa ciò che non sa". Pubblicare una parte considerevole di pseudocodice può spaventare le persone ... se non puoi porre la tua domanda in nessun altro modo, sarà di grande aiuto allegare un file "prima" e "dopo" - e screenshot - in modo che gli spettatori abbiano concretezza esempi di una tabella "iniziale" (o dati di testo) e una tabella "finale". Questo farebbe sicuramente una vera differenza in questo caso particolare. Se devi "disinfettare" i set di dati, va bene (meglio, davvero). Finché il punto che stai cercando di illustrare può ancora essere raggiunto, va tutto bene.
Se poni domande specifiche e ben mirate e includi file illustrativi e screenshot, è probabile che molti qui entreranno per aiutarti. Mi vengono in mente più di pochi improvvisi che non riescono davvero a resistere!
Saluti,
Brady
Oggetto: spostamento di un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneGrazie, Brady.Oggetto: spostamento di un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneCiao a tutti. Ecco il mio codice finora:
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
);
);L'ho cancellato in modo che sia confidenziale (non preoccuparti di spiare le informazioni aziendali;)) pur mantenendo la struttura e le informazioni (nome "a" nome, etichetta su etichetta).
Il mio problema è con questa linea al momento:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Lancia il messaggio di errore
.
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 data di esecuzione è una colonna di dati (intestazione) nella mia tabella di dati (in particolare, dt_data) con le date di esecuzione dell'esperimento. Sto cercando di trasferirli nel secondo file, poiché ogni punto dati dovrebbe essere stato raccolto tre volte / tre volte ed è per questo che data_array ha tre chiavi e tre valori vuoti quando viene inizializzato. Qui è dove vanno i dati, questo array associativo (data_array). Viene quindi trasferito a dt_manifest ma è per dopo, una volta che questa parte funziona.
Per ora sembra che stia avendo problemi ad accedere, in linea
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
la selezione appropriata di righe e colonne che mi interessano. L'affermazione del problema è abbastanza chiara a questo punto da consentire a chiunque nel pubblico di intervenire e offrire una soluzione o un contributo su come specificare in modo più sintatticamente (e possibilmente semanticamente) corretto come selezionare il sottoinsieme di dati che sono interessato a (da data_dt)?
Non preoccuparti per il problema di trasposizione. Mi occuperò di questo più tardi e penso che onestamente dovrebbe essere abbastanza facile una volta che i dati sono in un aa (array associativo). A questo punto sto ancora imparando a manipolare le selezioni di riga / colonna, sottoinsiemi di tabelle di dati, ecc. Problemi correlati.
Un'altra nota: se sembra strano che le date, i dati e gli array vengano confusi, è molto probabilmente perché ho scelto nomi scadenti per i titoli / etichette di pulizia / anonimizzazione delle colonne di dati o entità di dati rilevanti per mantenere i segreti della mia azienda al sicuro. Sono ancora un principiante in questo intero processo direi, e preferisco sbagliare sul sicuro.
Continuerò a lavorare sul problema dalla mia parte.
Grazie molto,
Mike
Oggetto: spostamento di un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneMike,
Rimango perso un po 'sul motivo per cui si desidera utilizzare un array associativo, ma a prescindere, credo che il codice seguente si sposterà nell'array, i valori della data per le 3 righe di misurazione per ogni ID.Ho creato alcuni dati che spero somiglino al layout dei tuoi dati.Sto solo supponendo in base alle tue dichiarazioni e all'utilizzo del codice.

Ecco il copione.La tabella dati sopra viene generata all'inizio dello script, quindi il coraggio del tuo codice, con le mie modifiche, arriva sotto la generazione della tabella dati.
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);
);
I risultati del codice sono elencati nel 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];
I numeri in data_array sono i valori numerici per le date di esecuzione.
Oggetto: spostamento di un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneCiao,
Scrivi:
Il mio problema è con questa linea al momento:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Vedo un paio di potenziali problemi ... assicurati di esaminare questi:
1): Run Date, come scritto, si riferisce a una colonna in qualsiasi tabella di dati sia corrente nel momento in cui questa riga di codice viene interpretata. Dal messaggio di errore sembra che al momento dell'interpretazione di questa riga di codice, la tabella dati corrente non contenga una colonna chiamata "Run Date". Vedo che apri due tavoli; assicurati sempre che la tabella desiderata sia effettivamente la tabella corrente, lasciando decidere a JMP quale tabella utilizzare. Puoi forzare qualsiasi tabella che desideri sia la tabella corrente, utilizzando il comando Tabella dati corrente:
dt1 = open("firstfile");
dt2 = open("secondfile");
Current Data Table (dt1); // sets first table current
Current Data Table (dt2); //sets second table current
Tuttavia, non è necessario lasciare che sia JMP a decidere. È possibile specificare esplicitamente la tabella da utilizzare, corrente o meno, utilizzando un file tabella: colonna formato, come in:
dt1:Run Date
2) Una volta risolto il problema relativo alla valuta della tabella, dovrai utilizzare l'estensione << ottieni righe dove () messaggio, inviato alla tabella dati appropriata, per restituire le righe che soddisfano alcuni criteri. Spesso questi sono usati come indici, come nel tuo caso. Supponendo che tu voglia lavorare con dt1, il codice apparirà come:
data_array[data] = dt1:Run Date[dt1 << Get rows Where(:ID == ID & :Timepoint == data)];
Questa linea fa 3 lavori:
1) Ottiene le righe in dt1 che soddisfano alcuni criteri, restituendole in un vettore. Nota che perché il << ottieni righe dove () messaggio viene inviato a dt1, resta inteso che: ID e: Timepoint sono anche in dt1.
2) Utilizza il vettore restituito nel passaggio 1 sopra come indici per dt1: Run Date, che è la colonna Run Date in dt1. Poiché abbiamo definito in modo esplicito Run Date per la tabella dt1 utilizzando dt1: Run Date, non importa se dt1 è la tabella corrente o meno. Il completamento di questo secondo passaggio restituisce un vettore di valori, esattamente quelli desiderati, dalla colonna Run Date.
3) Assegna il vettore dei valori Run Date restituiti nel passaggio 2 sopra come valore di una chiave specifica, dati, nella matrice associativa, data_array .
Saluti,
Brady
Oggetto: spostamento di un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneCiao Jim. Grazie per la risposta. Ti dispiacerebbe spiegare in inglese umano come funziona il tuo codice? La mia interpretazione è: tutte le righe in cui l'ID è univoco vengono inserite inRows. Quindi, viene istanziato un indice k.Viene incrementato all'interno del ciclo in cui le date di esecuzione vengono aggiunte all'array di dati.All'interno di questo ciclo, ora, invece di quello che avevo prima, ogni valore univoco in theRows viene utilizzato come indice per accedere: Run date e quel risultato viene popolato nell'array di dati.
Questo avrebbe senso per me se solo lo studiassi più a lungo. Non è troppo chiaro a prima vista. Non è sicuro. Ma spieghi alla fine del tuo post con una conclusione di una riga.
Dopo aver sostituito tutte le variabili cancellate con le mie variabili reali nel mio codice, ottengo l'errore:
invalid subscript (must be number or list of numbers) in access or evaluation of 'theRows[k]' , theRows[/*###*/k]
e non so perché.
Sono ancora confuso e continuerò a studiare questo bit di codice. È strano, ho seguito una discreta quantità di lezioni di programmazione al college, ma non ho mantenuto la mia base di conoscenze, quindi suppongo che avrebbe potuto erodersi nel tempo.
Grazie per l'aiuto!
Michael
PS: Per quanto riguarda il motivo degli array associativi: ho pensato che sarebbe stato un modo efficiente per trasferire dati come principiante di JMP con esperienza più simile a Java / Python. Consiglieresti di manipolare direttamente le tabelle? Sono così lontano su questa strada, tuttavia, che mi chiedo se sarebbe semplicemente interessante completare il compito in questo modo.
Re: Spostare un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneGrazie, Brady. Tutto questo ha senso per me.
Sembra che alcune di queste cose fossero in realtà problemi nel mio codice. Mi sono rivolto a loro e sto andando avanti. Ho nuovi problemi che posterò una volta che li avrò capiti un po'.
Mike