Matlab`unstack`:可以安全地对新列进行排序吗?

时间:2019-01-17 22:54:40

标签: matlab pivot

根据documentation,Matlab的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}进行操作,那么除非有人可以百分百确定用于排序新列的方案,否则数据可能都是错误的。

我实际上创建了一个新列来代替Town,其中包含有效字符串,后缀为数字索引值。这些成为新的列标题。但是现实是,必须编写额外的代码来确保列以正确的顺序出现是很麻烦的。它抵消了unstack的好处,而我最终只是创建循环以逐一建立新列。在时间和代码方面效率不高或不够优雅。我正在尝试找到一种在将来可靠地利用堆栈的方法。

我已经提交了反馈,描述了这一信息的重要性,但是我不希望很快得到答复。同时,拆栈是一项非常有用的功能,我想知道是否有人可以对假设新列的字母顺序进行排序是否明智?

1 个答案:

答案 0 :(得分:5)

是的,根据我在unstack.m的代码源中所了解的(您可以通过键入edit unstack进行阅读),这些列将按照 Unicode字母顺序 >通过使用将标识符转换为唯一索引的函数,在之前检查标识符是否有效

Unicode order的具体含义是:

  • 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标识符是字母数字(AZ,az,0-9)的字符向量,并带有下划线,因此第一个字符是字母,并且字符向量的长度小于或等于namelengthmax

     

makeValidName会删除所有空白字符,然后替换任何不是字母数字或下划线的字符。如果空格字符后接小写字母,makeValidName会将字母转换为相应的大写字符。

例如:

  • 2A将更改为x2A
  • ça将更改为x_A

特殊情况将在matlab.lang.makeuniquestrings函数的帮助下进行。

例如,如果您询问标识符:ç1à1,Matlab仍然可以区分它们并将它们分别重命名为x_1_1x_1


在您的情况下,我建议自动生成具有恒定起始字母的列,然后自动生成带前导零的索引,从而产生恒定数量的字符:T0001T0002,..., T0100,...,T9999