From 58a59525bddb2d6a606bb6ea3c2e4895502318a3 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Thu, 29 Jul 2010 18:15:59 +0200 Subject: [PATCH] AGGREGATE: Fixed a bug with MEDIAN vs. MODE=ADDVARIABLES --- src/language/stats/aggregate.c | 31 ++++++++++++++++--------------- tests/language/stats/aggregate.at | 23 ++++++++++++----------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/language/stats/aggregate.c b/src/language/stats/aggregate.c index 7430b819e9..b2132ec71a 100644 --- a/src/language/stats/aggregate.c +++ b/src/language/stats/aggregate.c @@ -1003,21 +1003,22 @@ dump_aggregate_info (const struct agr_proc *agr, struct casewriter *output, cons break; case MEDIAN: { - struct casereader *sorted_reader; - struct percentile *median = percentile_create (0.5, i->cc); - struct order_stats *os = &median->parent; - - sorted_reader = casewriter_make_reader (i->writer); - - order_stats_accumulate (&os, 1, - sorted_reader, - i->weight, - i->subject, - i->exclude); - - v->f = percentile_calculate (median, PC_HAVERAGE); - - statistic_destroy (&median->parent.parent); + if ( i->writer) + { + struct percentile *median = percentile_create (0.5, i->cc); + struct order_stats *os = &median->parent; + struct casereader *sorted_reader = casewriter_make_reader (i->writer); + i->writer = NULL; + + order_stats_accumulate (&os, 1, + sorted_reader, + i->weight, + i->subject, + i->exclude); + i->dbl[0] = percentile_calculate (median, PC_HAVERAGE); + statistic_destroy (&median->parent.parent); + } + v->f = i->dbl[0]; } break; case SD: diff --git a/tests/language/stats/aggregate.at b/tests/language/stats/aggregate.at index 860c939d7f..3c10d3ad40 100644 --- a/tests/language/stats/aggregate.at +++ b/tests/language/stats/aggregate.at @@ -222,29 +222,30 @@ begin data. 5 4 6 7 5 8 7 6 9 -7 7 10 +7 7 20 9 8 11 end data. aggregate outfile=* mode=addvariables /break = x /sum = sum(y) - /mean = mean (y). + /mean = mean (y) + /median = median (y). list. ]) AT_CHECK([pspp -O format=csv addvariables.sps], [0], [Table: Data List -x,cn,y,sum,mean -1.00,1.00,2.00,2.00,2.00 -3.00,2.00,3.00,7.00,3.50 -3.00,3.00,4.00,7.00,3.50 -5.00,4.00,6.00,6.00,6.00 -7.00,5.00,8.00,27.00,9.00 -7.00,6.00,9.00,27.00,9.00 -7.00,7.00,10.00,27.00,9.00 -9.00,8.00,11.00,11.00,11.00 +x,cn,y,sum,mean,median +1.00,1.00,2.00,2.00,2.00,2.00 +3.00,2.00,3.00,7.00,3.50,3.50 +3.00,3.00,4.00,7.00,3.50,3.50 +5.00,4.00,6.00,6.00,6.00,6.00 +7.00,5.00,8.00,37.00,12.33,9.00 +7.00,6.00,9.00,37.00,12.33,9.00 +7.00,7.00,20.00,37.00,12.33,9.00 +9.00,8.00,11.00,11.00,11.00,11.00 ]) AT_CLEANUP -- 2.30.2