AGGREGATE: Fixed a bug with MEDIAN vs. MODE=ADDVARIABLES
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 29 Jul 2010 16:15:59 +0000 (18:15 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Thu, 29 Jul 2010 16:15:59 +0000 (18:15 +0200)
src/language/stats/aggregate.c
tests/language/stats/aggregate.at

index 7430b819e90a2889aa4cb57be6575b180293335a..b2132ec71a99f13a0276ea66da3c35c2be210d85 100644 (file)
@@ -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:
index 860c939d7f858e6b636274eea1bc858cbf6cfe55..3c10d3ad40fdc8a3e0a2daebd1e3e11a89c4a94c 100644 (file)
@@ -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