根据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的好处,而我最终只是创建循环以逐一建立新列。在时间和代码方面效率不高或不够优雅。我正在尝试找到一种在将来可靠地利用堆栈的方法。
我已经提交了反馈,描述了这一信息的重要性,但是我不希望很快得到答复。同时,拆栈是一项非常有用的功能,我想知道是否有人可以对假设新列的字母顺序进行排序是否明智?
答案 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_1
,x_1
。
在您的情况下,我建议自动生成具有恒定起始字母的列,然后自动生成带前导零的索引,从而产生恒定数量的字符:T0001
,T0002
,..., T0100
,...,T9999
。