根据文档,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的好处,我最终只是创建循环来逐个构建新列.在时间和代码方面效率不高或不优雅.我正试图找到一种可靠地利用未来堆栈的方法.
我已经提交了反馈,描述了这些信息的重要性,但我不希望很快回复.同时,拆散是一个非常有用的功能,我想知道是否有人可以权衡假设新列的字母顺序的可取性?
是的,根据我在代码源中的理解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.