Как бы вы выполняли операции между строками на основе нескольких столбцов? МАТЛАБ

Я начинающий программист, в основном самоучка. Я новичок в MATLAB и реляционной математике. В настоящее время я пытаюсь выполнять математические операции между строками. Я хотел бы нормализовать exp соответствующим con, а затем умножить на константу.

Это constant лабораторное измерение, которое может быть изменено в будущих экспериментах. Таким образом, я дал ему столбец.

Ниже приведен пример кода, который я создал для иллюстрации моей проблемы и решения. Я пытаюсь перейти от myTable к rTable.

Я признаю, что мое решение очень небрежно, и должен быть способ выполнения этих операций, понятный человеку и использующий меньше временных переменных. Короче говоря, должен быть более простой способ.

rTable = table();
myTable = table(transpose(1:8), ...
                transpose({'Con1', 'Con2', 'Exp1', 'Exp2',...
                           'Con1', 'Con2', 'Exp1', 'Exp2'}),...
                transpose({'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'}),...
                ones(8, 1) * 2,...
                'VariableNames', {'Values' , 'Condition', 'Group', 'Constant'});

[r, c] = size(myTable)

a = myTable(strcmp(myTable.Group, 'A'), :);
b = myTable(strcmp(myTable.Group, 'B'), :);

aexp1 = a.Values(strcmp(a.Condition, 'Exp1'), :) / a.Values(strcmp(a.Condition, 'Con1'), :) * mean(a.Constant);
aexp2 = a.Values(strcmp(a.Condition, 'Exp2'), :) / a.Values(strcmp(a.Condition, 'Con2'), :) * mean(a.Constant);

bexp1 = b.Values(strcmp(b.Condition, 'Exp1'), :) / b.Values(strcmp(b.Condition, 'Con1'), :) * mean(b.Constant);
bexp2 = b.Values(strcmp(b.Condition, 'Exp2'), :) / b.Values(strcmp(b.Condition, 'Con2'), :) * mean(b.Constant);

aT = table(transpose({aexp1, aexp2}),...
           transpose({'Exp1', 'Exp2'}),...
           transpose({'A', 'A'}),...
           transpose({2, 2,}),...
           'VariableNames', {'Values', 'Condition', 'Group', 'Constant'});

bT = table(transpose({bexp1, bexp2}),...
           transpose({'Exp1', 'Exp2'}),...
           transpose({'B', 'B'}),...
           transpose({2, 2,}),...
           'VariableNames', {'Values', 'Condition', 'Group', 'Constant'});

rTable = [aT; bT]

Спасибо за любой вклад или предложения. Возможно, структура данных, с которой я работаю, плохо организована.


person Nicholas Hayden    schedule 26.12.2017    source источник


Ответы (1)


Вот одно из решений:

rTable = table();
myTable = table((1:8)',{'Con1', 'Con2', 'Exp1', 'Exp2','Con1', 'Con2', 'Exp1', 'Exp2'}',...
    {'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'}','VariableNames', {'Values' , 'Condition', 'Group', 'Constant'})





conditionrows = contains(myTable.Condition,'Con')
exprows = contains(myTable.Condition,'Exp')
conditionTable = myTable(conditionrows,:)
expTable = myTable(exprows,:)

constant = 2
rValues = expTable.Values./conditionTable.Values * constant

rTable = expTable
rTable.Values = rValues

Поскольку вы пытаетесь получить таблицу только из exprows, вы разделяете исходную таблицу на ConditionTable и expTable. Я предполагаю, что у вас есть одна строка условия для каждой строки exp, а также что у вас есть хорошее соответствие в таблицах (если нет, это потребует дополнительной обработки), тогда вы можете вычислить rValue просто с помощью однострочного выражения. ./ — это поэлементное деление. Также обратите внимание, что вы можете использовать 'для выполнения транспонирования в Matlab (также обратите внимание, что если вам нужен вектор-столбец 1:10, например, вам нужно сделать (1:10)', 1:10' дает вам вектор-строку из 1 до 10, так как 1:10' интерпретируется как вектор от 1 до транспонирования 10.

person liyuan    schedule 28.12.2017