Matlab `unstack`: безопасно ли предполагать порядок новых столбцов? - PullRequest
0 голосов
/ 18 января 2019

Согласно документации , Matlab's unstack может взять эту таблицу:

S=12×3 table
Storm    Town    Snowfall
_____    ____    ________

  3      'T1'        0   
  3      'T3'        3   
  1      'T1'        5   
  3      'T2'        5   
  1      'T2'        9   
  1      'T3'       10   
  4      'T2'       12   
  2      'T1'       13   
  4      'T3'       15   
  2      'T3'       16   
  4      'T1'       17   
  2      'T2'       21   

... и преобразовать его в:

U = unstack(S,'Snowfall','Town')

U=4×4 table
Storm    T1    T2    T3
_____    __    __    __

  3       0     5     3
  1       5     9    10
  4      17    12    15
  2      13    21    16

Представляется разумным предположить, что новые столбцы генерируются в алфавитном порядке. Предполагать, что это было бы хорошо, если кто-то манипулирует данными вручную, но является преградой для автоматической обработки данных, если нельзя быть на 100% уверенным в порядке расположения столбцов. Например, если столбец Town на самом деле является числовым индексом, то новые имена столбцов будут автоматически генерироваться, чтобы быть допустимыми именами переменных, а упорядочение было бы ключевым элементом информации, связывающим новые столбцы со значениями. в поле Town. Если кто-то извлекает U {:, 2: end} для манипулирования, все данные могут быть неверными, если только вы не можете быть на 100% уверены в том, что схема для упорядочения новых столбцов.

Я фактически создаю новый столбец вместо Town, содержащий допустимую строку с суффиксом числового индекса. Они становятся новыми заголовками столбцов. Но реальность такова, что писать дополнительный код, чтобы обеспечить правильное расположение столбцов, - это слишком большая проблема. Это исключает преимущество unstack, и я просто создал циклы для создания новых столбцов один за другим. Не эффективный или элегантный с точки зрения времени и кода. Я пытаюсь найти способ надежно использовать unstack в будущем.

Я уже отправил отзыв, описывающий важность этой части информации, но я не ожидаю ответа в ближайшее время. Между тем, unstacking - это такая полезная функция, что мне интересно, может ли кто-нибудь задуматься о целесообразности алфавитного упорядочения новых столбцов?

1 Ответ

0 голосов
/ 18 января 2019

Да, исходя из того, что я понял в исходном коде unstack.m (вы можете прочитать его, набрав edit unstack), столбцы будут в алфавитном порядке, следующем за Юникод в алфавитном порядке с помощью функции, которая преобразует идентификатор в уникальный индекс, перед проверкой , является ли идентификатор действительным .

Порядок Unicode будет означать, в частности:

  • что T10 будет до T9.
  • t10 будет после T10.

Согласно unstack, функция, которая преобразует идентификатор в уникальный индекс subs2inds, опирается на класс tabularDimension, который называется (на R2018b) временной:

%tabularDimension Internal abstract class to represent a tabular's dimension.

% This class is for internal use only and will change in a
% future release.  Do not use this class.

После сортировки идентификаторов приходит проверка достоверности с помощью функции matlab.lang.makeValidName (с использованием опции по умолчанию 'Prefix','x'), которая изменит идентификатор, если он недопустим (по умолчанию заменяется недопустимый символ подчеркиванием). ).

Действительный идентификатор MATLAB - это символьный вектор буквенно-цифровых символов (A – Z, a – z, 0–9) и подчеркивания, так что первый символ является буквой, а длина символьного вектора меньше или равна namelengthmax.

makeValidName удаляет все пробельные символы перед заменой любых символов, которые не являются буквенно-цифровыми или подчеркиваниями. Если после пробела следует строчная буква, makeValidName преобразует букву в соответствующий заглавный символ.

Например:

  • 2A будет изменено на x2A.
  • ça будет изменено на x_A.

Особый случай будет рассмотрен с помощью функции matlab.lang.makeuniquestrings.

Например, если вы спросите идентификаторы: ç1, à1, Matlab все равно сможет их различать и переименовывать соответственно x_1_1, x_1.


В вашем случае я предлагаю автоматически генерировать столбцы с постоянной начальной буквой, а затем индекс с ведущими нулями, в результате чего получается постоянное количество символов: T0001, T0002, ..., T0100, ..., T9999.

...