在Matlab中减去其他行中的值指定的行中的某些值

时间:2015-10-01 17:51:42

标签: matlab

我有一个类似于

的数据表
Construct  Stain  Position  Value
VinTL       FAK    0 - 0.1    4
VinTL       ABD    0 - 0.1    2
VinTL       FAK    0 - 0.2    1
VinTL       ABD    0 - 0.2    5
VinTS       ABD    0 - 0.1    7
VinTS       FAK    0 - 0.2    3
VinTS       ABD    0 - 0.2    9
VinTS       FAK    0 - 0.1    8

我想在某个位置取每个染色(例如:染色是FAK,位置是0 - 0.1)并在VinTL的构造中找到值。然后在相同位置取相同的Stain并在VinTS的Construct处找到该值。然后我想从第二个值中减去第一个值并创建一个新表。例如,该表的输出为

Stain    Position    New_Value
 FAK      0 - 0.1      -4
 FAK      0 - 0.2      -2
 ABD      0 - 0.1      -5
 ABD      0 - 0.2      -4

实际的数据表会有更多的污点和更多的位置。 Stain,Position,Construct的每个组合都是独一无二的。

1 个答案:

答案 0 :(得分:0)

如果您的所有数据都在表格中,您可以执行以下操作:

% convert all reapeating data to categorical arrays:
data.Construct = categorical(data.Construct);
data.Stain = categorical(data.Stain);
data.Position = categorical(data.Position);

% find all 'VinTS' value and change them to negative:
VinTS_ind = data.Construct=='VinTS';
data.Value(VinTS_ind) =  -data.Value(VinTS_ind);

% find all unique rows in 'Stain' & 'Position',
% and sum all thier instances:
[new_table,~,ci] = unique(data(:,2:3));
new_table.new_value = accumarray(ci,data.Value)

结果:

new_table =
  4×3 table
    Stain    Position    new_value
    _____    ________    _________
    ABD      0 - 0.1     -5       
    ABD      0 - 0.2     -4       
    FAK      0 - 0.1     -4       
    FAK      0 - 0.2     -2 
顺便说一下,你写的是你想要从第二个值中减去第一个值,但在你的例子中,你做了相反的事情。我在我的建议中遵循了这个例子。