Spostamento di un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneMi dispiace di postare di nuovo. Ho postato qui frammenti del mio flusso di lavoro, mascherato, per chiedere aiuto, e sto ancora lottando. Ho difficoltà a controllare le risposte perché ho avuto brutte esperienze su StackOverflow, venivo sgridato e cose del genere senza una vera ragione. Sono sicuro che le cicatrici guariranno con il tempo. Comunque, sono qui e prima o poi leggerò le 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, in cui non ero presente) in tre colonne separate di un file manifest che tiene traccia dei metadati in corso per il nostro progetto, da quanto ho capito, in modo che ogni colonna sia un'istanza di raccolta dati. Ci sono più donatori, ognuno 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 lavorare e finora è stato difficile. Non so perché. Non sono un esperto informatico, sviluppatore o ingegnere del software. Ogni 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 identifier
Fusione e pulizia dei datiOggetto: spostare un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneOra sto cercando di assegnare i dati/le date al file manifest nelle righe con gli ID corretti:
... );
//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
);
cosa che, in realtà, non ho ancora idea di come fare da JSL come principiante, quindi ottengo l'errore
["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"] /*###*/Non ho idea di cosa significhi.
Grazie,
Mike
Oggetto: spostare un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneIl sotto funziona per me ...
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)]
);
);tranne che ora ho più copie di ciascuna voce di dati (data e ora) nel data_array. Mi chiedo come pulirlo, fare solo una copia di ogni data/dato in data_array?
Ho provato un'istruzione if, utilizzando un'istruzione As Date() per confrontare e formattare le date per il confronto e l'immissione per assicurarmi di ottenere un solo valore univoco. Ma questo mi ha dato problemi finora (cioè l'array si trasforma in errore o di nuovo vuoto).
Tuttavia, sono davvero contento dei progressi compiuti finora.
@txnelson : Scusa, mi piace il tuo metodo e ti ringrazio per il tuo aiuto, ma noterai che sono stato in grado di farne uso senza la tua tecnica di indicizzazione "k"
. (Mi chiedo come vada il tuo metodo quando ci sono più date dello stesso valore, che è quello che ho nel mio caso?)
@brady_brady : Si noti che ho implementato gli identificatori della tabella dati prima che la colonna chiami dove appropriato. Grazie per avermi insegnato questo concetto di base; Stavo morendo di curiosità al riguardo e ho cercato su Google senza fine senza risultati fino ad ora.
Mike
Oggetto: spostare un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneCiao a tutti. Sto facendo progressi, in realtà, per una volta, invece di rimanere bloccato su qualcosa senza sapere in che direzione andare.
Al momento una delle mie coppie chiave/valore non si adatta, quindi ottengo risultati errati da una delle mie chiamate di array. Sto cercando di eseguire il debug di questo in modo da poter sottoinsiemi/filtrare correttamente la tabella dei dati fino a ciò che voglio per il trasferimento all'array associativo.
Grazie mille per tutto il tuo aiuto.
MikeOggetto: spostare un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneGrazie Brady. Tutto ha senso per me.
Sembra che alcune di queste cose fossero in realtà problemi nel mio codice. Li ho affrontati e sto andando avanti. Ho nuovi problemi che posterò una volta che li avrò capiti un po'.
Mike
Oggetto: spostare 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 in theRows. 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 a :Run date e tale risultato viene popolato nell'array di dati.
Questo avrebbe senso per me se solo lo studiassi più a lungo. A prima vista non è troppo chiaro. Non sono 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 pezzo 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 potrebbe essersi erosa nel tempo.
Grazie per l'aiuto!
Michael
PS: sul motivo per cui gli array associativi: ho pensato che sarebbe stato un modo efficiente per trasferire i dati come principiante di JMP con esperienza più sulla falsariga di Java/Python. Consiglieresti di manipolare direttamente le tabelle? Sono così avanti lungo questo percorso, però, che mi chiedo se sarebbe semplicemente interessante completare il compito in questo modo.
Oggetto: spostare un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneCiao,
Scrivi:
Il mio problema è con questa riga 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, fa riferimento a una colonna in qualsiasi tabella di dati sia corrente al momento in cui questa riga di codice viene interpretata. Sembra dal messaggio di errore 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; assicurarsi sempre che la tabella prevista sia effettivamente la tabella corrente, se si lascia a JMP la decisione di 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 in modo esplicito la tabella da utilizzare, corrente o meno, utilizzando a tabella: colonna formato, come in:
dt1:Run Date
2) Una volta risolto il problema con la valuta del tavolo, dovrai utilizzare il file << 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. Si noti che poiché il file << 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 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 Data di esecuzione.
3) Assegna il vettore dei valori Run Date restituiti nel passaggio 2 precedente come valore di una chiave specifica, dati, nell'array associativo, matrice_dati .
Saluti,
Brady
Oggetto: spostare un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneMike,
Rimango un po 'perso 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 ciascun ID.Ho inventato alcuni dati che spero assomiglino al layout dei tuoi dati.Sto solo supponendo in base alle tue dichiarazioni e all'utilizzo del codice.

Ecco la sceneggiatura.La tabella di dati sopra viene generata all'inizio dello script, quindi il coraggio del tuo codice, con le mie modifiche, arriva sotto la generazione della tabella di 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: spostare 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 riservato (non preoccuparti di spiare le informazioni aziendali;)) pur mantenendo la struttura e le informazioni (nome 'a' nome, etichetta per etichetta).
Il mio problema è con questa riga al momento:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Genera 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>
:Run date è una colonna di dati (intestazione) nella mia tabella di dati (in particolare, dt_data) con le date di esecuzione dell'esperimento. Sto provando a trasferirli nel secondo file, poiché ogni punto dati avrebbe dovuto essere 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 io abbia difficoltà 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 in questo momento da consentire a chiunque nel pubblico di presentarsi e offrire una soluzione o un contributo su come specificare in un modo più sintatticamente (e possibilmente semanticamente) corretto come selezionare il sottoinsieme di dati che sto interessato a (da data_dt)?
Non preoccuparti del problema di trasposizione. Me ne occuperò più tardi, e penso onestamente che dovrebbe essere abbastanza facile una volta che i dati sono in un aa (array associativo). A questo punto sto ancora imparando come manipolare le selezioni di righe/colonne, sottoinsiemi di tabelle di dati, ecc.
Un'altra nota: se sembra strano che date, dati e 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 tutto questo processo, direi, e preferisco sbagliare sul sicuro.
Continuerò a lavorare sul problema dalla mia parte.
Grazie molto,
Mike
Oggetto: spostare un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneGrazie Brady.Oggetto: spostare un sottoinsieme di dati da una tabella alle colonne di una seconda tabella con una trasposizioneCiao,
Benvenuto nella comunità! Mi dispiace che tu abbia avuto esperienze negative su altri forum quando hai chiesto aiuto. Sebbene la community degli utenti di JMP sia un luogo accogliente e disponibile, esistono alcune "best practice" che dovrebbero massimizzare le possibilità di ottenere le informazioni che cerchi.
Fare domande specifiche, vice più generali, è la strada da percorrere se riesci a farcela, anche se mi rendo conto che a volte uno "non sa cosa 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 schermate - in modo che gli spettatori abbiano concrete esempi di tabella "inizio" (o dati di testo) e tabella "fine". Questo farebbe sicuramente la differenza in questo caso particolare. Se devi "disinfettare" i set di dati, va bene (il migliore, davvero). Finché il punto che stai cercando di illustrare può ancora essere espresso, va tutto bene.
Se fai domande specifiche e ben mirate e includi file illustrativi e schermate, è probabile che molti qui interverranno per aiutarti. Mi viene in mente più di qualche disinvolto che non può davvero resistere!
Saluti,
Brady