2016-09-27 2 views
1

У меня есть высокий MATLAB table так:Как я могу эффективно развернуть таблицу с репликациями в MATLAB от высокого до широкого формата?

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, так же, как показано на рисунке in another stack page, может быть многообещающим, но в моем случае было бы проще выполнить одноразовое преобразование вручную.

Кому-нибудь известно о более эффективном подходе?

ответ

-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 
+0

Если вы собираетесь самостоятельно ответить на ваш вопрос, нужно больше информации, чем ссылка на другой ответ. –

+0

Спасибо, что сообщили мне об этике @AnderBiguri. Я добавил пример в свой ответ. – vkehayas

Смежные вопросы