Revision 2704

tmp/org.txm.statsengine.r.core/src/org/txm/statsengine/r/core/data/MatrixImpl.java (revision 2704)
323 323
	public void filter(int nlines, int fmin, int fmax) throws RWorkspaceException, REXPMismatchException {
324 324
		RWorkspace rw = RWorkspace.getRWorkspaceInstance();
325 325
		
326
		if (nlines < 1) nlines = 1;
327
		if (fmax < fmin) fmax = fmin;
328
		
326 329
		// first sort rows
327 330
		rw.eval("freqs <- rowSums(" + symbol + ")"); //$NON-NLS-1$ //$NON-NLS-2$
328 331
		int[] freqs = rw.eval("freqs").asIntegers(); //$NON-NLS-1$
329 332
		rw.eval("order <- sort(freqs, decreasing= TRUE, index.return= TRUE)"); //$NON-NLS-1$
330 333
		// rw.eval("print(order)");
331 334
		
332
		// get table sort indexes
335
		// get table sort indexes : from max to min
333 336
		int[] order = rw.eval("order$ix").asIntegers();  //$NON-NLS-1$
334 337
		
335
		// sort the table
338
		// sort the table to cut later
336 339
		rw.eval(symbol + "<- " + symbol + "[order$ix, ];"); //$NON-NLS-1$ //$NON-NLS-2$
337 340
		
338 341
		// find first fmin line
339
		int ifmin = 999999999;
340
		int ifmax = 0;
341
		for (int i = 0; i < order.length; i++) {
342
		int ifmin = order.length;
343
		int ifmax = 1;
344
		for (int i = 0; i < order.length; i++) { // iterate from max to min freqs
342 345
			// System.out.print("\t"+i+" freqs["+order[i]+"]"+freqs[order[i]-1]);
343 346
			if (freqs[order[i] - 1] < fmin) { // minus 1 because of R indexes
344 347
				ifmin = i; // the ith line
......
347 350
		}
348 351
		// ifmin = Math.min(order.length - 1, ifmin);
349 352
		
350
		for (int i = order.length - 1; i >= 0; i--) {
353
		for (int i = ifmin - 1; i >= 0; i--) { // iterate from min to max freqs
351 354
			// System.out.print("\t"+i+" freqs["+order[i]+"]"+freqs[order[i]-1]);
352 355
			// System.out.println("i=" + i + " o=" + order[i] + " f=" + freqs[order[i] - 1]);
353 356
			if (freqs[order[i] - 1] > fmax) { // minus 1 because of R indexes
......
356 359
			}
357 360
		}
358 361
		
362
		ifmin = Math.max(1, Math.min(nlines, ifmin));
363
		ifmax = Math.max(1, ifmax);
359 364
		// cut
360
		cut(Math.max(1, ifmax), Math.min(nlines, ifmin));
365
		
366
		cut(ifmax, ifmin); // ifmax is always < to fmin, because of the decreasing loop index
367
		
361 368
	}
362 369
	
363 370
	/**
364 371
	 * Cut.
365 372
	 *
366
	 * @param nRowToCut the nlines
373
	 * @param before lines before 'before' are removed
374
	 * @param after lines after 'after' are removed
367 375
	 * @throws StatException
368 376
	 */
369 377
	public void cut(int before, int after) {

Also available in: Unified diff