Matlab`unstack`:安全地假设新列的排序?

use*_*800 2 matlab pivot

根据文档,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   
Run Code Online (Sandbox Code Playgroud)

...并将其转换为:

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
Run Code Online (Sandbox Code Playgroud)

假设新列按字母顺序生成似乎是合理的.假设如果一个人手动操作数据,这将是正常的,但如果不能100%确定列的排序,则是自动数据处理的交易破坏者.例如,如果Town列实际上是一个数字索引,那么新的列名称将自动生成,以便成为合法的变量名称,并且排序将是将新列链接回Town字段中的值的关键信息..如果提取U {:,2:end}进行操作,那么数据可能都是错误的,除非人们可以100%确定订购新列的方案.

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

我已经提交了反馈,描述了这些信息的重要性,但我不希望很快回复.同时,拆散是一个非常有用的功能,我想知道是否有人可以权衡假设新列的字母顺序的可取性?

alp*_*ra7 5

是的,根据我在代码源中的理解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.
Run Code Online (Sandbox Code Playgroud)

排序标识后,自带的有效性与功能检查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.