首页 > 解决方案 > Matlab`unstack`:可以安全地假设新列的排序?

问题描述

根据文档,Matlabunstack可以使用此表:

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 是一个非常有用的功能,我想知道是否有人可以权衡假设新列的字母顺序是否可取?

标签: matlabpivot

解决方案


是的,根据我在代码源中的理解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


推荐阅读