Choose Language Hide Translation Bar
Highlighted
kcorder
Occasional Contributor

Sum Amount of Consecutive Zeros in a Column

Hello JMP Community,

 

I am currently working on a project that randomly outputs either a "0" or "1" for 100 different time values. Each run of this corresponds to a "seed". I need to somehow code something that counts the number of consecutive 0's starting from a time point for each seed, and then prints it in a data table. If the seed being evaluated at a certain time starts with a 1, its sum is 0. From there, once all of these sums of consecutive 0's are found, I need to find its average (the average of zeroes before a 1 occurs). Attached below is the code I have so far (it only creates the seeds and time values).

 

Thanks,

Kyle

 

 

 

Close All( Data Tables, No Save );
//Make the data table
dt = New Table( "Case 1",
Add Rows( 100 ),
New Column( "Time", Set Formula( Sequence( 1, 100 ) ) ),
New Column( "Seed 1", Numeric, "Continuous", Format( "Best", 10 ), Formula( Random Integer( 0, 1 ) ) )
);

For( i = 2, i < 101, i++,
dt << New Column( "Seed " || Char( i ), Numeric, Continuous, Formula( Random Integer( 0, 1 ) ) ),

);

 

0 Kudos
3 REPLIES 3
cwillden
Super User

Re: Sum Amount of Consecutive Zeros in a Column

How do you want the average counts as output?  Here's a way that puts it into an associative array:

seed_avg = Associative Array();
nseed = 100;
for(i = 1, i <= nseed, i++,
	col_name = "Seed " || char(i);
	col = Column(dt, col_name );
	count_vec = [];
	count = 0;
	for(j = 1, j <= N Row(dt), j++,
		if(col[j] == 0,
			count++,
			if(col[j] == 1 & count != 0,
				count_vec = count_vec |/ count;
				count = 0
			);
		)
	);
	Insert Into(seed_avg, col_name, mean(count_vec));
);

This can be easily adapted to output to a table or whatever format you prefer.

-- Cameron Willden
0 Kudos
kcorder
Occasional Contributor

Re: Sum Amount of Consecutive Zeros in a Column

Thank you for the detailed response -- however, I am still having some trouble. From my understanding, the Associative Array makes a key... For example, the output contains "["Seed 1"] => 2.143"

Since each run corresponds to a time value, shouldn't it look something like "["Time 1" => 2.143"]?

Also, how exactly would I get it adapted to a table?

I tried dt << New Column("Mean", Set Formula(seed_avg)); , but that gives me a whole list of values for each entry in the column.

Thanks
0 Kudos
cwillden
Super User

Re: Sum Amount of Consecutive Zeros in a Column

Sorry, I didn't understand that you were wanting to go across rows rather than down each column.  Here's a way to get it by time point with the results in a new column.

dt << New Column("Average", numeric);

nseed = 100;
for(i = 1, i <= N Row(dt), i++,
	count_vec = [];
	count = 0;
	for(j = 1, j <= nseed, j++,
		col = Column(dt, "Seed " || char(j) );
		if(col[i] == 0,
			count++,
			if(col[j] == 1 & count != 0,
				count_vec = count_vec |/ count;
				count = 0
			);
		)
	);
	dt:Average[i] = mean(count_vec);
);

 

-- Cameron Willden
0 Kudos