|
51 | 51 | elseif (isstring (s) && isvector (s)) |
52 | 52 | s_was_string = true; |
53 | 53 | s = cellstr (s); |
54 | | - elseif (iscategorical (s) && isvector (s)) |
| 54 | + elseif (iscategorical (s) && (isvector (s) || isempty (s))) |
55 | 55 | s_was_categorical = true; |
56 | 56 | undef = isundefined (s); |
57 | 57 | cats = categories (s); |
|
100 | 100 |
|
101 | 101 | if (nargout > 1) |
102 | 102 | if (s_was_categorical) |
103 | | - gn = categories (categorical (s)); |
| 103 | + if (isempty (s)) |
| 104 | + gn = cats(:); |
| 105 | + elseif (all (isnan (g))) |
| 106 | + gn = cell (0,1); |
| 107 | + else |
| 108 | + gn = cats(:); |
| 109 | + endif |
104 | 110 | elseif (s_was_duration) |
105 | 111 | gn = cellstr(gl); |
106 | 112 | elseif (iscellstr (gl)) |
|
333 | 339 | %! assert (isequaln (g, [NaN; 1; 2; NaN])); |
334 | 340 | %! assert (isequal (gn, {'high'; 'low'})); |
335 | 341 | %! assert (isequal (gl, string ({'high'; 'low'}))); |
| 342 | + |
| 343 | +## Test empty categorical with defined categories |
| 344 | +%!test |
| 345 | +%! s = categorical ({}, {'low','med','high'}); |
| 346 | +%! [g, gn, gl] = grp2idx (s); |
| 347 | +%! assert (isempty (g)); |
| 348 | +%! assert (isequal (gn, {'low'; 'med'; 'high'})); |
| 349 | +%! assert (isequal (gl, categorical ({'low'; 'med'; 'high'}))); |
| 350 | + |
| 351 | +## Test all-undefined categorical |
| 352 | +%!test |
| 353 | +%! s = categorical ({'a','b','c'}); |
| 354 | +%! s(:) = categorical (missing); |
| 355 | +%! [g, gn, gl] = grp2idx (s); |
| 356 | +%! assert (isequaln (g, [NaN; NaN; NaN])); |
| 357 | +%! assert (isempty (gn)); |
| 358 | +%! assert (isequal (gl, categorical (cell (0,1)))); |
| 359 | + |
| 360 | +## Test all-missing string |
| 361 | +%!test |
| 362 | +%! s = string ({missing, missing}); |
| 363 | +%! [g, gn, gl] = grp2idx (s); |
| 364 | +%! assert (isequaln (g, [NaN; NaN])); |
| 365 | +%! assert (isempty (gn)); |
| 366 | +%! assert (isequal (gl, string (cell (0,1)))); |
0 commit comments