Docs
[pspp] / src / language / stats / ctables.c
index d087e000cf17ae071a570dcbec0ec15cf0c2787d..bb7f5c37aa973afe6a6b6431e37d81bef9ff9079 100644 (file)
@@ -2551,11 +2551,14 @@ ctables_summary_init (union ctables_summary *s,
       break;
 
     case CTSF_MEAN:
+    case CTSF_SUM:
+    case CTSF_areaPCT_SUM:
+      s->moments = moments1_create (MOMENT_MEAN);
+      break;
+
     case CTSF_SEMEAN:
     case CTSF_STDDEV:
-    case CTSF_SUM:
     case CTSF_VARIANCE:
-    case CTSF_areaPCT_SUM:
       s->moments = moments1_create (MOMENT_VARIANCE);
       break;
 
@@ -2652,24 +2655,37 @@ ctables_summary_add (union ctables_summary *s,
   switch (ss->function)
     {
     case CTSF_TOTALN:
-    case CTSF_areaPCT_TOTALN:
       s->count += ss->weighted ? d_weight : 1.0;
       break;
 
+    case CTSF_areaPCT_TOTALN:
+      s->count += ss->weighted ? e_weight : 1.0;
+      break;
+
     case CTSF_COUNT:
-    case CTSF_areaPCT_COUNT:
       if (is_scale || !excluded_missing)
         s->count += ss->weighted ? d_weight : 1.0;
       break;
 
+    case CTSF_areaPCT_COUNT:
+      if (is_scale || !excluded_missing)
+        s->count += ss->weighted ? e_weight : 1.0;
+      break;
+
     case CTSF_VALIDN:
-    case CTSF_areaPCT_VALIDN:
       if (is_scale
           ? !is_scale_missing
           : !is_missing)
         s->count += ss->weighted ? d_weight : 1.0;
       break;
 
+    case CTSF_areaPCT_VALIDN:
+      if (is_scale
+          ? !is_scale_missing
+          : !is_missing)
+        s->count += ss->weighted ? e_weight : 1.0;
+      break;
+
     case CTSF_areaID:
       break;
 
@@ -2677,7 +2693,7 @@ ctables_summary_add (union ctables_summary *s,
       if (is_scale
           ? is_scale_missing
           : is_missing)
-        s->count += ss->weighted ? d_weight : 1.0;
+        s->count += ss->weighted ? e_weight : 1.0;
       break;
 
     case CTSF_ECOUNT:
@@ -2714,11 +2730,15 @@ ctables_summary_add (union ctables_summary *s,
     case CTSF_STDDEV:
     case CTSF_SUM:
     case CTSF_VARIANCE:
-    case CTSF_areaPCT_SUM:
       if (!is_scale_missing)
         moments1_add (s->moments, value->f, ss->weighted ? e_weight : 1.0);
       break;
 
+    case CTSF_areaPCT_SUM:
+      if (!is_missing && !is_scale_missing)
+        moments1_add (s->moments, value->f, ss->weighted ? e_weight : 1.0);
+      break;
+
     case CTSF_MEDIAN:
     case CTSF_MODE:
     case CTSF_PTILE:
@@ -3726,8 +3746,8 @@ ctables_table_add_section (struct ctables_table *t, enum pivot_axis_type a,
             for (size_t i = 0; i < nest->n; i++)
               hmap_init (&s->occurrences[a][i]);
         }
-      for (size_t i = 0; i < N_CTATS; i++)
-        hmap_init (&s->areas[i]);
+      for (enum ctables_area_type at = 0; at < N_CTATS; at++)
+        hmap_init (&s->areas[at]);
     }
 }
 
@@ -5189,8 +5209,8 @@ ctables_section_uninit (struct ctables_section *s)
     }
 
   hmap_destroy (&s->cells);
-  for (size_t i = 0; i < N_CTATS; i++)
-    hmap_destroy (&s->areas[i]);
+  for (enum ctables_area_type at = 0; at < N_CTATS; at++)
+    hmap_destroy (&s->areas[at]);
 }
 
 static void
@@ -5257,7 +5277,7 @@ ctables_execute (struct dataset *ds, struct casereader *input,
       for (struct ccase *c = casereader_read (group); c;
            case_unref (c), c = casereader_read (group))
         {
-          double d_weight = dict_get_case_weight (dict, c, &warn_on_invalid);
+          double d_weight = dict_get_rounded_case_weight (dict, c, &warn_on_invalid);
           double e_weight = (ct->e_weight
                              ? var_force_valid_weight (ct->e_weight,
                                                        case_num (c, ct->e_weight),