我有一个高MATLAB table这样:
spam =
Data cat1 cat2 time
__________ ___________ __________ ______
-0.41763 1 0 0
0.11719 1 0 0
... ... ... ...
-0.16546 1 0 1
... ... ... ...
-0.21763 1 0 2
0.31719 2 0 0
... ... ... ...
0.58116 3 1 0
... ... ... ...
Data
是双重格式,cat1
(8个级别)和cat2
(3个级别)是绝对的,time
(3个级别)是序数的(但可以加倍)。每个cat1
和cat2
级别的每个时间点都包含30个(技术性)重复项(上面用...
表示)。
我希望在fitrm
中使用这些数据,这要求它们采用宽格式。因此,我需要将Data
列转换为三个单独的变量。
使用unstack
我得到这样的内容:
spam = unstack(spam, 'Data', 'time')
Warning: Variable names were modified to make them valid MATLAB identifiers.
spam =
cat1 cat2 x0 x1 x2
______ _________ ___________ _______ ________
1 0 -7.6605e-15 2.3168 0.45234
2 0 6.2172e-15 5.1661 24.89
3 1 8.8818e-16 56.697 40.441
4 1 -7.9936e-15 -22.741 -17.191
5 1 -1.4433e-15 -7.7803 -20.817
6 2 5.5511e-16 7.8535 -0.21172
7 2 5.3291e-15 13.658 5.8402
8 2 2.2204e-15 9.1739 13.814
显然,此结果不包括高表中的所有信息。 具体来说,重复没有被带到结果中。
以accumarray
的方式使用MATCH p = (:Blue)-[*]-(g:Green)
WHERE all(n IN tail(nodes(p)) WHERE n:Green)
OPTIONAL MATCH (g)--(g2:Green)
WITH p, collect(g2) AS greens
WHERE size(greens) <= 1
RETURN last(nodes(p))
可能很有希望,但在我的情况下,手动执行一次性转换似乎更容易。
是否有人意识到更有效的方法?
答案 0 :(得分:-1)
我现在意识到,也许最简单的方法是在高大的表格中添加额外的变量replication
,然后使用unstack
,如上所述。
示例(使用不同的数据,取自my answer here):
name = ['A' 'A' 'A' 'B' 'B' 'C' 'C' 'C' 'C' 'D' 'D' 'E' 'E' 'E']';
value = randn(14, 1);
rep = [1, 2, 3, 1, 2, 1, 2, 3, 4, 1, 2, 1, 2, 3];
T = table(name, value, rep);
T =
name value rep
____ _________ ___
A 0.53767 1
A 1.8339 2
A -2.2588 3
B 0.86217 1
B 0.31877 2
C -1.3077 1
C -0.43359 2
C 0.34262 3
C 3.5784 4
D 2.7694 1
D -1.3499 2
E 3.0349 1
E 0.7254 2
E -0.063055 3
pivotTable = unstack(T, 'value','name')
pivotTable =
rep A B C D E
___ _______ _______ ________ _______ _________
1 0.53767 0.86217 -1.3077 2.7694 3.0349
2 1.8339 0.31877 -0.43359 -1.3499 0.7254
3 -2.2588 NaN 0.34262 NaN -0.063055
4 NaN NaN 3.5784 NaN NaN