Choose Language Hide Translation Bar

## need help identifying first nonzero column

I have a large dataset with around 30 columns of time-dated financial entries.  I want to know which column is the first with a nonzero (no columns have missing data, but I want to get the first column with a positive value entry) value.  I've attached a small made-up example with four time columns and a fifth column showing what I'd like my formula to result in.  If the zero values were missing, I could use the function for Number (number of nonmissing values) to get what I want, but when there is no missing data and zero values, I can't figure out how to automate identifying which column is the first that has a positive value.  Any ideas will be appreciated.

1 ACCEPTED SOLUTION

Accepted Solutions

## Re: need help identifying first nonzero column

@dale_lehman
Couple of thoughts and solutions here to your problem .

Approach 1 : Continue with JSL from previous solution and add it to table

``````dt = Current Data Table();
Mat = dt << Get As Matrix;
DesList = list();
for(i = 1 , i <= N Rows(Mat), i++,
Pos = Min(Loc(Mat[i,0]));
Insert Into(DesList,Pos);
);

dt << New Column("Test",Numeric,Continuous,<< Set Values(DesList));

// Please note that there will be "." missing value if none of your columns have a positive value ``````

Approach 2 : Script the formula in JSL and apply it to the table - a little roundabout - but scaleable - an old but relevant example - will edit later in the day

``````for(i = 1, i <= N Items(InvColNames), i++,
If(i == 1,
Stmt = ":" || InvColNames[i] || " >= 1 &" || ":" || InvColNames[i] || " <= InvLimit" ;
,
Stmt = Stmt || " & " || ":" || InvColNames[i] || ">= 1 &" || ":" || InvColNames[i] || " <= InvLimit"  ;
) ;
);

Eval( Parse( Eval Insert("\[ dt_Inp << New Column("Status_Inv",Numeric,Continuous,Formula(^Stmt^)); ]\" ) ) );``````

Approach 3 :  Manually do something like this - not a fan of this, but can't seem to find an alternative by myself - maybe others will have better thoughts

``````If(
:Column 1 > 0, "Column 1",
:Column 2 > 0, "Column 2",
"No Positive"
)``````
Best
Uday
3 REPLIES 3

## Re: need help identifying first nonzero column

@dale_lehman

Maybe try this ?

``````dt = Current Data Table();
Mat = dt << Get As Matrix;
DesList = list();
for(i = 1 , i <= N Rows(Mat), i++,
Pos = Min(Loc(Mat[i,0]));
Insert Into(DesList,Pos);
);
Show(DesList); ``````
Best
Uday

## Re: need help identifying first nonzero column

Thank you - this indeed computes what I want, but I need a bit more help (due to my almost nonexistent JSL abilities).  I can see the correct calculations in the log window, but when I enter your script into the formula window for a new column, I get blank values.  The warning I get concerns the Show() function.  How do I get the resulting calculations to appear in the new formula column?

## Re: need help identifying first nonzero column

@dale_lehman
Couple of thoughts and solutions here to your problem .

Approach 1 : Continue with JSL from previous solution and add it to table

``````dt = Current Data Table();
Mat = dt << Get As Matrix;
DesList = list();
for(i = 1 , i <= N Rows(Mat), i++,
Pos = Min(Loc(Mat[i,0]));
Insert Into(DesList,Pos);
);

dt << New Column("Test",Numeric,Continuous,<< Set Values(DesList));

// Please note that there will be "." missing value if none of your columns have a positive value ``````

Approach 2 : Script the formula in JSL and apply it to the table - a little roundabout - but scaleable - an old but relevant example - will edit later in the day

``````for(i = 1, i <= N Items(InvColNames), i++,
If(i == 1,
Stmt = ":" || InvColNames[i] || " >= 1 &" || ":" || InvColNames[i] || " <= InvLimit" ;
,
Stmt = Stmt || " & " || ":" || InvColNames[i] || ">= 1 &" || ":" || InvColNames[i] || " <= InvLimit"  ;
) ;
);

Eval( Parse( Eval Insert("\[ dt_Inp << New Column("Status_Inv",Numeric,Continuous,Formula(^Stmt^)); ]\" ) ) );``````

Approach 3 :  Manually do something like this - not a fan of this, but can't seem to find an alternative by myself - maybe others will have better thoughts

``````If(
:Column 1 > 0, "Column 1",
:Column 2 > 0, "Column 2",
"No Positive"
)``````
Best
Uday