坚持使用单元格阵列,因为我无法摆脱它...但是,对于你们这里的人来说,这将是一件容易的事。
所以这就是为什么: 我有一个数据集(数据),其中包含两个变量:A(数字)和B(单元格数组)。 不幸的是,我甚至无法重建问题,但我导入的表格看起来像这样:
data=dataset;
data.A = [1;1;3;3;3];
data.B = ['A';'A';'BUU';'BUU';'A'];
其中data.B是5x1类型的单元格,我无法重建
我现在想要的只是像
这样的独特行ans = [1 A; 3 BUU; 3 A] 结果应该在数据集中,或者只是两个行相等的向量。
但唯一([dataA dataB],'rows')无法处理单元格数组,我无法在www中找到如何将单元格数组B简单地转换为字符串向量(它是否存在?)
cell2mat()对我不起作用,因为字长不同('A'对'BUU')。
虽然,我想学习两件事:将5x1单元格制作成字符串向量 并从数字和字符串(或单元格)中查找唯一的行。
非常感谢!
干杯多米尼克
答案 0 :(得分:1)
问题是A
和B
字段的类型不同。虽然它们可以连接成一个单元格数组,但unique
无法处理它。像这样的案例的一般伎俩是"翻译"每个字段(列)的元素到唯一标识符,即数字。可以分别将unique
应用于每个字段并获取其第三个输出来完成此转换。现在可以将获得的标识符连接成矩阵,使得该矩阵的每一行是"复合标识符"。最后,带有unique
选项的'rows'
可以应用于此矩阵。
所以,在你的情况下:
[~, ~, kA] = unique(data.A);
[~, ~, kB] = unique(data.B);
[~, jR] = unique([kA kB], 'rows');
现在将结果构建为(格式与data
)
result.A = data.A(jR);
result.B = data.B(jR);
或(2D单元格数组)
result = cat(2, mat2cell(data.A(jR), ones(1,numel(jR))), data.B(jR));
答案 1 :(得分:0)
这是我的解决方案
tt.A = [1;1;3;3;3];
tt.B = {'A';'A';'BUU';'BUU';'A'};
将整数转换为字符,然后合并并查找唯一字符串
tt.C = cellstr(num2str(tt.A));
tt.D = cellfun(@(x,y) [x y],tt.C,tt.B,'UniformOutput',0);
[tt.F,tt.E] = unique(tt.D);
显示结果
tt.F