2012-05-28 51 views
0

我一直难倒试图创​​建一个如果,否则循环,调换下面的分选:MATLAB移调和嵌入式IF语句

Subject: Date: Result: 
AAA 02/01/12 10 
AAA 02/02/12 12 
AAA 02/03/12 14 
BBB 02/01/12 25 
BBB 02/02/12 26 
BBB 02/03/12 27 
CCC 01/01/12 66 
CCC 01/02/12 70 
CCC 01/03/12 75 

我希望跨列被调换的信息,如下图所示:

SUBJECT 01/01/12 01/02/12 01/03/12 02/01/12 02/02/12 02/03/12 
AAA RESULT 
BBB RESULT 
CCC RESULT 

每列只有一个日期,每行只有一个主题。结果将匹配各自的主题并放置在适当的单元格中。这些数据可以包含几个主题,数千个主题,日期和结果。一些结果可能由非数值(NaN)组成。另外,主题和日期可以以任意顺序排列,主题可以由数字和字符串组成。

UPDATE @amro & superbest

如果我有日期格式的文本文件:800317 ==月/ 17/1980年, 我怎么会导入这个和修改你写代码? 再次感谢。

+0

你的结果描述有点不清楚,你只是试图制作一个稀疏矩阵,行代表主题,列是日期?如果您完成了上述所需的输出,即不要只放置结果,而是将数字值放在正确的位置(对于您给出的示例),这将有所帮助。 – Dan

+0

@BernardUntalanJr:以及如何存储这些数据:单元格数组,数据集对象? – Amro

+0

这是一个文本文件,字符矩阵,单元格数组或字符串的单元数组(每行作为它自己的字符串)?另一个问题是'RESULT'没有提供你想要的内容,在你的示例数据中有几个'AAA','BBB'和'CCC'行,每个行都有不同的结果,但只有一个'RESULT'在您所需的输出中分别输入“AAA”,“BBB”和“CCC”。另外,您的示例数据和期望输出中的日期顺序似乎与我不一致。你想排序日期吗?如果是的话,你有DD/MM/YY,YY/MM/DD,MM/DD/YY还是别的吗? – nrz

回答

1

下面是一个脚本,应该做你想要什么:

% Clean up 
clc 
clear 

% Hardcoded example input 
input = { 
    'AAA' '02/01/12' 10 
    'AAA' '02/02/12' 12 
    'AAA' '02/03/12' 14 
    'BBB' '02/01/12' 25 
    'BBB' '02/02/12' 26 
    'BBB' '02/03/12' 27 
    'CCC' '01/01/12' 66 
    'CCC' '01/02/12' 70 
    'CCC' '01/03/12' 75 
    }; 

% Figure out how many rows and columns there will be 
header_row = unique(input(:, 2)); 
header_col = unique(input(:, 1)); 

% Pre-allocation for better performance 
output = cell(length(header_col), length(header_row)); 

% Rearrange the array 
for i = 1:size(input, 1) 
    % Find to which date and subject this element belongs 
    subject = find(strcmp(header_col, input{i, 1})); 
    date = find(strcmp(header_row, input{i, 2})); 

    % Put the value in the appropriate slot 
    output{subject, date} = input{i, 3}; 
end 

% Add header columns and rows and print the result 
result = [['SUBJECT' header_row']; [header_col output]]; 
+0

感谢您的工作! – Buntalan

2

如果您将数据存储在dataset array对象中,那么unstack方法就是您正在查找的内容(有时也称为高对广泛转换)。


我制定了一个简单的例子,说明如何做到这一点没有DataSet类:

%# cell array: subjects, dates, values 
data = { 
    'AA' '2012-05-01' 0.1 
    'AA' '2012-05-03' 0.2 
    'BB' '2012-05-02' 0.3 
    'CC' '2012-05-01' 0.4 
    'CC' '2012-05-02' 0.5 
    'CC' '2012-05-03' 0.6 
}; 

[subjects,~,subjectsMap] = unique(data(:,1)); 
[dates,~,datesMap] = unique(data(:,2)); 
M = nan(numel(subjects),numel(dates)); 
for i=1:numel(subjects) 
    %# get all rows with subject == subject_i 
    rIdx = (subjectsMap == i); 
    %# fill values at this row for the specified columns 
    M(i,datesMap(rIdx)) = cell2mat(data(rIdx,3)); 
end 

D = cell(size(M)+1); 
D(2:end,2:end) = num2cell(M);  %# fill values 
D(1,2:end) = dates;     %# column headers 
D(2:end,1) = subjects;    %# row headers 

,这里是之前(高)后(宽)转换数据:

>> data 
data = 
    'AA' '2012-05-01' [0.1] 
    'AA' '2012-05-03' [0.2] 
    'BB' '2012-05-02' [0.3] 
    'CC' '2012-05-01' [0.4] 
    'CC' '2012-05-02' [0.5] 
    'CC' '2012-05-03' [0.6] 

>> D 
D = 
     [] '2012-05-01' '2012-05-02' '2012-05-03' 
    'AA' [  0.1] [  NaN] [  0.2] 
    'BB' [  NaN] [  0.3] [  NaN] 
    'CC' [  0.4] [  0.5] [  0.6] 
+0

感谢您的工作!我感谢您的帮助 – Buntalan