Показать значения в Matlab в зависимости от предыдущих значений в другом столбце - PullRequest
0 голосов
/ 08 апреля 2020

Я борюсь со следующей проблемой в Matlab:

У меня есть таблица, содержащая несколько векторов столбцов: Day, Name, Result Моя цель - создать еще один вектор столбцов ( New вектор ), который показывает мне в каждой строке результат предыдущего дня для соответствующего имени.

| Day | Name | Result | New Vector |
|-----|------|--------|------------|
| 1   | A    | 1.2    | 0          |
| 1   | C    | 0.9    | 0          |
| 1   | B    | 0.7    | 0          |
| 1   | D    | 1.1    | 0          |
| 2   | B    | 1      | 0.7        |
| 2   | A    | 1.5    | 1.2        |
| 2   | C    | 1.4    | 0.9        |
| 2   | D    | 0.9    | 1.1        |
| 3   | B    | 1.1    | 1          |
| 3   | C    | 1.3    | 1.4        |
| 3   | A    | 1      | 1.5        |
| 3   | D    | 0.3    | 0.9        |

Например строка 5 :

Это день 2 и имя "B" . Вектор "РЕЗУЛЬТАТ" показывает 1.0 в той же строке, но то, что я хочу показать в моем новом векторе, является значением результата "B" из предыдущий день ( день 1 в этом примере). Так как "B" в предыдущий день можно найти в строке 3 , значение result равно 0.7 , которое должно быть показано в строка 5 моего Нового вектора.

Когда день равен 1, логическим следствием этого является отсутствие значений, поскольку предыдущего дня нет. Следовательно, я хочу показать 0 для каждой строки в День 1.

Я уже пробовал некоторые комбинации уникальных для получения индекса и некоторые предложения if, но это не сработало вообще, так как я относительно новичок в Матлаб и все еще очень растерялся.

Кто-нибудь может помочь? Большое вам спасибо !!

1 Ответ

1 голос
/ 09 апреля 2020

Ваш вопрос не определен, но приведенный ниже код решает вашу проблему, как указано.

Этот код работает путем внутренней сортировки информации каждого дня в порядке Имени. Это позволяет легко создавать новый вектор, просто сдвигая и затем инвертируя операцию сортировки.

close all; clear all; clc;

% A few column vectors
Day = [1;1;1;1;2;2;2;2;3;3;3;3];
Name = ['A';'C';'B';'D';'B';'A';'C';'D';'B';'C';'A';'D'];
Result = [1.2;0.9;0.7;1.1;1;1.5;1.4;0.9;1.1;1.3;1;0.3];

% Sort the table (so Name is in order for each Day)
[~,Index] = sort(max(Name)*Day + Name);
Day = Day(Index);
Name = Name(Index);
Result = Result(Index);

% Shift Result to get sorted NewVector
NewVector = circshift(Result, 4);
NewVector(1:4) = 0;

% Unsort NewVector, to get original table ordering
ReverseIndex(Index) = 1:length(Index);
NewVector = NewVector(ReverseIndex)

Это печатает следующий результат:

NewVector =

         0
         0
         0
         0
    0.7000
    1.2000
    0.9000
    1.1000
    1.0000
    1.4000
    1.5000
    0.9000
...