Reformatting a cell array based on the duplicates
1 次查看(过去 30 天)
显示 更早的评论
Hello, I have a table with two columns and a number of rows (first column contains a variable name and the second column contains its value). The entries of the first column (the variable names) has duplicates, as shown in the example below:
'x1' [1]
'x2' [2]
'x3' [3]
'x4' [4]
'x1' [2]
'x4' [8]
'x2' [5]
'x1' [5]
'x4' [1]
I would like to record the name of the unique variables as the header (without repeatitions) and their values below them. In case of few values, the last value will be repeated just to fill up the cells. From my cell array above I would like to achieve something like this:
'x1' 'x2' 'x3' 'x4'
[ 1] [ 2] [ 3] [ 4]
[ 2] [ 5] [ 3] [ 8]
[ 5] [ 2] [ 3] [ 1]
How would I achieve this? Any Ideas? Kind regards,
采纳的回答
the cyclist
2017-2-6
Here is a straightforward method, if a bit cumbersome. Someone will undoubtedly find a slick one-liner that is better. :-)
A = {
'x1' 1;
'x2' 2;
'x3' 3;
'x4' 4;
'x1' 2;
'x4' 8;
'x2' 5;
'x1' 5;
'x4' 1
}
[uniqueA,~,jj] = unique(A(:,1));
numberUniqueA = numel(uniqueA);
counts = histcounts(jj,[unique(jj); Inf]);
B = cell(max(counts)+1,numberUniqueA);
B(1,:) = uniqueA';
for ni = 1:numberUniqueA
indexToThisA = (ni==jj);
numberThisA = sum(indexToThisA);
B(2:numberThisA+1,ni) = A(indexToThisA,2);
end
This will actually leave empty cell elements, instead of replicating. Is that OK? If not, then it is also easy to just find the empty cells and fill those in.
更多回答(1 个)
Stephen23
2017-2-6
编辑:Stephen23
2017-2-6
Not quite one line:
>> [U,~,idx] = unique(A(:,1));
>> C = arrayfun(@(n)A(idx==n,2),unique(idx),'Uni',0)';
>> N = max(cellfun('size',C,1));
>> M = cellfun(@(v)[v;repmat(v(end),N-numel(v),1)],C,'Uni',0);
>> Z = [U';[M{:}]]
Z =
'x1' 'x2' 'x3' 'x4'
[ 1] [ 2] [ 3] [ 4]
[ 2] [ 5] [ 3] [ 8]
[ 5] [ 5] [ 3] [ 1]
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Data Preprocessing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!