J'essaie de créer un script qui peut parcourir chaque cellule de chaque colonne pour compter le nombre de cellules inférieures ou supérieures à une valeur spécifiée.
Si j'ai un tableau des colonnes A ~ D et des lignes 1 ~ 10, j'aimerais compter les valeurs des cellules par ligne et par colonne. En d'autres termes, pour toutes les lignes de la colonne A, combien répondent à mes critères. Et de même pour toutes les colonnes de la ligne 1, combien répondent à mes critères. Je ferais ensuite cela pour toutes les lignes et colonnes.
Voici ce que j'ai essayé de commencer, mais cela ne renvoie rien. Des idées à ce sujet ou une façon plus efficace de le faire?
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 );
)
)
);
Vous pouvez également remplacer la section "Pour chaque ligne" par une ligne pour compter le nombre de lignes pour chaque colonne.Cela utiliserait les fonctions datatable au lieu d'avoir à parcourir chaque ligne de chaque colonne.
COUNT_VAL=NROWS((DT<<SELECT where=""></SELECT>
Il y a quelques problèmes avec le script qui sont facilement résolus.
1. La partie test de la boucle for est erronée :
<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>
Le nombre de colonnes numériques ne change pas. S'il y a 0 ou 1 colonnes numériques, la boucle s'exécutera indéfiniment car 0<=1 et 1<=1. S'il y a au moins 2 colonnes numériques, la boucle ne s'exécute pas du tout car 2 (ou plus) <= 1 est toujours faux. Le test devrait être celui-ci :
i <= N Items( Numeric Columns )
Cela teste si votre itérateur (i) est supérieur au nombre de colonnes et s'arrête lorsqu'il l'est.
2. Dans une boucle For Each Row, vous devez toujours inscrire l'indice dans la ligne, vous n'avez simplement pas à gérer l'itération vous-même. Alors cette pièce :
<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>
Devrait ressembler à ceci :
<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. Votre variable Count est une liste, mais vous la traitez comme un nombre. Count++ ne fait rien à une liste qui n'est pas remplie de nombres. Définissez Count = 0 au lieu de Count = {}. En outre, Count++ renvoie la valeur actuelle, puis définit Count sur Count +1. Donc Count = Count++ ne changera jamais la valeur de Count. (Exemple : Compte = 0. Compte = Compte++. Le compte est toujours égal à zéro.)
Voici le script complet avec les modifications ci-dessus. Le décompte final est le nombre de cellules dans toutes les colonnes numériques qui sont inférieures à 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,
Mélanie
@abdulj ,
Vous pouvez utiliser des matrices pour identifier les conditions que vous souhaitez tester. Voici un exemple,
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]);