如何在Matlab中对表格的部分进行排序?
我在Matlab中有一个表格,其中包含来自不同测试人员的测试数据。该测试有七个视频剪辑,每个视频剪辑都有四种不同的音频版本,测试人员必须按照1到100的等级进行评分。为了统计准确性,每个视频剪辑都会出现两次。测试人员按下接口上的按钮1-4以听到不同的音频版本。如何在Matlab中对表格的部分进行排序?
我的表包含以下几列(其中包括一些其他不相关的问题):
Test Person ID Audio Version Video Clip Rating
1 1 Forest 40
1 2 Forest 60
1 3 Forest 20
1 4 Forest 100
现在,在测试过程中引进对特定按钮的任何有利于最小偏差,音频版本在每个视频剪辑之间随机排列。这意味着,真实的数据会看起来有点更像这个(音频版本不排序):
Test Person ID Audio Version Video Clip Rating
1 1 Forest 40
1 2 Forest 60
1 3 Forest 20
1 4 Forest 100
1 3 City 10
1 2 City 50
1 1 City 40
1 4 City 7
1 4 Inside 90
1 2 Inside 58
1 1 Inside 22
1 3 Inside 35
我想要做的是:保持视频剪辑的正确顺序,因此仍然有森林 - >市 - >里面,但有他们的所有排序,以便始终音频版本1,2,3,4:
Test Person ID Audio Version Video Clip Rating
1 1 Forest 40
1 2 Forest 60
1 3 Forest 20
1 4 Forest 100
1 1 City 40
1 2 City 50
1 3 City 10
1 4 City 7
1 1 Inside 22
1 2 Inside 58
1 3 Inside 35
1 4 Inside 90
我最初的想法是使用sortrow()
功能在Matlab中,然后与沿递增对它们进行排序视频剪辑,但由于视频剪辑在测试的不同阶段被引入两次,我想维护表格中剪辑的相同顺序不起作用。同样的视频剪辑也会呈现给众多不同的测试人员。
我正在使用预制功能,必须以这种方式对数据进行排序才能对其执行统计计算。该函数从结构中获取Matlab数据,并通过for循环行将其放入表中。
因为数据是通过一个for循环我认为有可能在同一时间内一个办法只能固定数量的行排序放入表即行1-4,5-8,9-12等等。 你知道是否有一种方法只能在Matlab中对一部分表格进行排序?
使用reshape
和sort
你可以这样做:
[~,idx]=sort(reshape(Audio_Version,4,[]));
idxtble = bsxfun(@plus,idx,0:4:(4*size(idx,2))-1);
table2 = table1(idxtble,:);
说明:
可以提取音频列,并将其重塑对[4 * N]矩阵:
audio = reshape(Audio_Version,4,[]);
然后对音频列进行排序并获得排序元素的索引:
[~,idx]=sort(audio);
这里idx
表示排序元素的行号。
转换idx
表中的整列的线性指标:
idxtbl = bsxfun(@plus,idx,0:4:(4*size(idx,2))-1);
重新排序表:
table2 = table1(idxtbl,:);
只是使用sortrow
像下表中指定部分:
table(1:4,:) = sortrow(table(1:4,:), 2);
table(4:8,:) = sortrow(table(4:8,:), 2);
table(8:12,:) = sortrow(table(8:12,:), 2);
首先排序表中的部分,然后用这部分更换。
您可以通过一个调用做到这sortrows
通过创建一个额外的数字代表您固定的视频演示模式的列。这个额外的列将简单地用连续的整数标记每组4行。它可以是concatenated to the beginning of the table,则可以通过第一和第三列进行排序,以获得您想要的顺序:
[~, index] = sortrows([table(ceil((1:size(T, 1)).'./4)) T], [1 3]);
T = T(index, :);
和输出:
T =
ID Audio Video Rating
__ _____ ________ ______
1 1 'Forest' 40
1 2 'Forest' 60
1 3 'Forest' 20
1 4 'Forest' 100
1 1 'City' 40
1 2 'City' 50
1 3 'City' 10
1 4 'City' 7
1 1 'Inside' 22
1 2 'Inside' 58
1 3 'Inside' 35
1 4 'Inside' 90
非常感谢答案 - 它看起来干净而简单。然而,在这个例子中,我不完全确定你使用'T'和table。如果表格是我已经感兴趣的表格,那么我在哪里/如何声明T? – matiastofteby
@matiastofteby:'T'是你现有的桌子。只需将其替换为存储表格的任何变量即可。 – gnovice
谢谢您的回答。我从idx得到预期的输出,即根据我的表中的顺序包含从1-4的索引的很多4行列。尽管'idxtble'虽然我不完全理解第二行。 当我尝试运行该行时,它表示“两个输入数组的非单独维度必须相互匹配”。我删除了四个增量,从而将该行更改为'idxtble = bsxfun(@ plus,idx,0:4:size(idx,2)-1);'(我认为是您的原始答案),但是当我我最终以table2为单个数值。 – matiastofteby
@matiastofteby对不起,延迟回复。你是对的。已更新。 – rahnema1
非常感谢!更新后的版本正如我所希望的那样工作。我现在已经接受了你的回答。祝你有美好的一天。 – matiastofteby