cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Choose Language Hide Translation Bar
hcarr01
Level VI

colonne égale à 0

Bonjour à tous,

 

Je cherche à réaliser des manipulations sur les colonnes lorsque la colonne ne contient pas que des valeurs égales à 0.
J’utilise le script ci-dessous mais j’obtiens une erreur.

hcarr01_0-1699519874496.png

Names Default To Here (1);

dt = current data table();

H = Col Sum(:"ATT2"n);
//show(H);

If(H != 0,
	dt << Select Where (:"ATT2"n == 1) << Subset (Selected Rows( 1 ), Selected columns only( 0 ) );
	Close(dt,NoSave);
	dt1 = current data table();
	,
	continue()
);

Avez-vous une idée de comment contourner ce problème ?

 

Merci pour votre aide !

1 ACCEPTED SOLUTION

Accepted Solutions
jthi
Super User

Re: colonne égale à 0

Ah.. Continue() should only be used with loops. Depending on what you wish to do, you might not even need the else statement (so remove , Continue()).

-Jarmo

View solution in original post

8 REPLIES 8
jthi
Super User

Re: colonne égale à 0

What do you wish to do with such columns?

-Jarmo
hcarr01
Level VI

Re: colonne égale à 0

Il s’agit d’un script que j’exécute chaque semaine, donc je peux pas prévoir si les colonnes seront égales à 0 ou pas. C’est pour cela que je fais ce test. Mon but est lorsque la colonne est différente de 0, je me permets d’extraire les lignes égale à 1 pour la colonne séléctionnée. Ensuite, je réalise différentes manipulations, jointures, calcul...

 

Il s’agit ici d’une base de données test pour vous montrer l’idée...

jthi
Super User

Re: colonne égale à 0

I'm not sure what is the problem or what you are doing, but I would first build a list of columns which contain non zero values (how do you deal with missing values? do you care about non zero values OR sum of zero?). And then based on that list I would do some actions. I use Loc()  here with datatable subscripting, but there are other methods for finding such columns

Names Default To Here(1);

dt = New Table("TEST",
	Add Rows(9),
	Compress File When Saved(1),
	New Column("ATT1", Numeric, "Continuous", Format("Best", 12), Set Values([1, 0, 0, 0, 1, 0, 0, 1, 1])),
	New Column("ATT2", Numeric, "Continuous", Format("Best", 12), Set Values([0, 0, 0, 0, 0, 0, 0, 0, 0])),
	New Column("ATT3", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 0, 0, 1, 1, 1, 1, 0])),
	New Column("ATT4", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 0, 0, -1, -1, 0, 0, 0])),
	New Column("ATT5", Numeric, "Continuous", Format("Best", 12), Set Values([0, 0, 0, ., 0, 0, 0, 0, .])),	
);

colnames = dt << Get Column Names("String");

// Option 1 - Loop using Loc and datatable subscripting
nonzerocols1 = {};
For Each({colname}, colnames,
	nonzeros = Loc(dt[0, colname]);
	If(N Items(nonzeros) > 0,
		Insert Into(nonzerocols1, colname);
	);
);
show(nonzerocols1);

// Option 2 - Matrix calculations
m_dt = dt[0,0]; // Could also use dt << Get As Matrix; instead of dt[0,0];
non_zero_col_idx = Loc(V Sum(m_dt != 0)); // single-liner for col indices
nonzerocols2 = colnames[non_zero_col_idx];
show(nonzerocols2);

// Option 3 - Using << Get Values
nonzerocols3 = {};
For Each({colname}, colnames,
	vals = Column(dt, colname) << get values;
	nonzeros = Sum(vals != 0);
	If(nonzeros > 0,
		Insert Into(nonzerocols3, colname);
	);
);
show(nonzerocols3);

// Option 4 - Get Rows Where
nonzerocols4 = {};
For Each({colname}, colnames,
	vals = dt << Get Rows Where(Column(colname) != 0); // This will also capture missing values
	If(N Items(vals) > 0,
		Insert Into(nonzerocols4, colname);
	);
);
show(nonzerocols4);

// Perform some actions using nonzerocol list
stop();

nonzerocol = nonzerocols[1];
nonzerorows = Loc(dt[0, nonzerocol]);
dt1 = dt << Subset(Rows(nonzerorows), Selected Columns Only(0), Output table("NONZERO BY " || nonzerocol));

Edit: Added other options of getting non-zero value columns (most of these will "consider" missing value as zero value)

-Jarmo
hcarr01
Level VI

Re: colonne égale à 0

Merci pour votre réponse !

 

C’est pas réellement ce que je cherche.
Concrètement, j’étudie vraiment colonne par colonne. J’ai différentes boucles if en étudiant à chaque fois une colonne précise avant de passer à l’étude de l’autre colonne.

 

Il ne peut pas y avoir de valeurs manquantes, les valeurs sont 0 ou 1. En théorie, je me soucie d’extraire juste les lignes, dont la valeur vaut 1 pour une colonne sélectionnée. J’ai utilisé la somme pour construire une boucle if dans le sens où si ma somme vaut zéro, cela veut dire que toutes mes valeurs sont nulles et je n’ai rien à extraire de la colonne.

 

Names default To Here(1);
dt = current data table();


col = Filter Each( {col_name}, dt << Get Column Names( "String", Continuous ),
	Starts With( col_name, "ATT2" )
);


nonzeros = Loc(dt[0, col]);
If(N Items(nonzeros) != N rows(dt),
	dt << Select Where (:"ATT2"n == 1) << Subset (Selected Rows( 1 ), Selected columns only( 0 ) );
	Close(dt,NoSave);
	dt1 = current data table();
	,
	continue()	
);

En m’inspirant de votre script, j’ai écris le script ci-dessus, mais j’obtiens la même erreur.

 

hcarr01_0-1699523328986.png

 

 

jthi
Super User

Re: colonne égale à 0

I don't understand the error message as it isn't in english. Do you have data table open? Are you using JMP16+?

-Jarmo
hcarr01
Level VI

Re: colonne égale à 0

hcarr01_0-1699524810569.png

Oui, lorsque j’exécute le script, j’ai une base de données qui est ouverte.
Oui j’utilise JMP 17 (Pro).

 

 

Peut-être existe-t-il un moyen en JSL de :
Si la colonne contient que des "0" continuer (fonction continue())
Sinon exécuter la suite du script...

jthi
Super User

Re: colonne égale à 0

Ah.. Continue() should only be used with loops. Depending on what you wish to do, you might not even need the else statement (so remove , Continue()).

-Jarmo
hcarr01
Level VI

Re: colonne égale à 0

Merci pour votre réponse, juste en enlevant la fonction "continue()" cela a fonctionné directement !