Sto cercando di creare uno script in grado di scorrere ogni cella di ogni colonna per contare il numero di celle inferiori o superiori a un valore specificato.
Se ho una tabella di colonne A ~ D e Righe 1 ~ 10, vorrei contare i valori delle celle per riga e per colonna. In altre parole, per tutte le righe della colonna A, quante soddisfano i miei criteri. E allo stesso modo per tutte le colonne della riga 1, quante soddisfano i miei criteri. Lo farei quindi per tutte le righe e colonne.
Ecco cosa ho provato a iniziare, ma non restituisce nulla. Qualche idea su questo o un modo più efficiente per farlo?
Names Default To Here( 1 );
dt = Current Data Table();
Clear Log();
// Get all of the numeric columns in the data table
Numeric Columns = dt << get column names( numeric, string );
NRows = N Rows( dt );
Count = {};
//Column loop
For( i = 1, N Items( Numeric Columns ) <= 1, i++,
For Each Row(
dt,
If( Column(dt, Numeric Columns[i]) < 101,
Count = Count++;
Show( Count );
)
)
);
Puoi anche sostituire la sezione "Per ogni riga" con una riga per contare il numero di righe per ogni colonna.Ciò utilizzerebbe le funzioni datatable invece di dover esaminare ogni riga di ogni colonna.
COUNT_VAL=NROWS((DT<<SELECT where=""></SELECT>
Ci sono alcuni problemi con lo script che possono essere risolti facilmente.
1. La porzione di test del ciclo for è errata:
<SPAN class="token function">N Items</SPAN><SPAN class="token punctuation">(</SPAN> Numeric Columns <SPAN class="token punctuation">)</SPAN> <SPAN class="token operator"><=</SPAN> <SPAN class="token number">1</SPAN>
Il numero di colonne numeriche non cambia. Se sono presenti 0 o 1 colonne numeriche, il ciclo verrà eseguito all'infinito perché 0<=1 e 1<=1. Se sono presenti almeno 2 colonne numeriche, il ciclo non viene eseguito affatto perché 2(o più)<=1 è sempre falso. Il test dovrebbe essere questo:
i <= N Items( Numeric Columns )
Ciò verifica se il tuo iteratore (i) è maggiore del numero di colonne e si ferma quando lo è.
2. In un ciclo For Each Row, è ancora necessario inserire un indice nella riga, semplicemente non è necessario gestire l'iterazione da soli. Quindi questo pezzo:
<SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>dt<SPAN class="token punctuation">,</SPAN> Numeric Columns<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">)</SPAN> <SPAN class="token operator"><</SPAN> <SPAN class="token number">101</SPAN>
Dovrebbe assomigliare a questo:
<SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>dt<SPAN class="token punctuation">,</SPAN> Numeric Columns<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">)[Row()]</SPAN> <SPAN class="token operator"><</SPAN> <SPAN class="token number">101</SPAN>
3. La tua variabile Count è una lista, ma la stai trattando come un numero. Count++ non fa nulla a un elenco che non è popolato di numeri. Impostare Count = 0 invece di Count = {}. Inoltre, Count++ restituisce il valore corrente e quindi imposta Count su Count +1. Quindi Count = Count++ non cambierà mai il valore di Count. (Esempio: Conteggio = 0. Conta = Conta++. Il conteggio è ancora uguale a zero.)
Ecco lo script completo con le modifiche di cui sopra. Il conteggio finale è il numero di celle in tutte le colonne numeriche inferiori a 101.
Names Default To Here( 1 );
dt = Current Data Table();
Clear Log();
// Get all of the numeric columns in the data table
Numeric Columns = dt << get column names( numeric, string );
NRows = N Rows( dt );
Count = 0;
//Column loop
For( i = 1, i <= N Items( Numeric Columns ), i++,
For Each Row(
dt,
If( Column(dt, Numeric Columns[i])[Row()] < 101,
Count++;
Show( Count );
)
)
);
HTH,
Melania
@abdulj ,
È possibile utilizzare le matrici per identificare le condizioni rispetto alle quali si desidera eseguire il test. Ecco un esempio,
Clear Log();
// Open a sample data set
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
// Extracting numeric column names
ColNames = dt << Get Column Names("String");
NumericCols = [];
for(nCol = 1, nCol <= N Items(ColNames), nCol++,
DType = Column(dt,nCol) << Get Data Type;
If(DType == "Numeric",
NumericCols = NumericCols || nCol;
);
);
NumericColNames = ColNames[NumericCols];
// Extract numeric data only
Mat = dt << Get As Matrix;
// Row Wise Test
// For e.g. Find all rows where year < 90
YearCondition = Loc(Mat[0,1] < 90);
Show(Mat[YearCondition,0]);