I believe the simplest and most efficient way to do this is to use
Tables==>Summary
This will create a data table very fast, from which you can get your statistics for your JSL, or if you need to have the statistics back into the original data table, a simple Update with matching will do that. Handling 200 columns and 1000 rows is not a problem at all. Below is a simple example that will illustrate how to do this.
names default to here(1);
dt=Open("$SAMPLE_DATA/semiconductor capability.jmp");
colNamesLIst = dt << get column names(continuous);
dtStats = dt << Summary(invisible,
Group( :SITE ),
Mean( colNamesList ),
Freq( "None" ),
Weight( "None" ),
Link to original data table(0)
);
dt << Update(
With( dtStats ),
Match Columns( :SITE = :SITE )
);
close( dtStats, nosave );
Jim