How to replace elements of a cell array using a containers.Map
Show older comments
I have a cell array of VariableNames that Matlab created when reading a csv file. I want to change them to my own choice of names however, the order of the names is not guaranteed.
iddata = readtable('data.csv');
var_names = iddata.Properties.VariableNames;
names_to_replace = {'TonnageDeBSA', 'D__bitD___eauAuBSA', ...
'PressionPalierSAG', 'PuissanceSAG'};
replacements = {'TonnageBSA', 'DebitEauBSA', ...
'PressionPalierSAG', 'PuissanceSAG'};
replace_map = containers.Map(names_to_replace, replacements);
Obviously I could use a for loop:
new_var_names = {};
for i=1:numel(var_names)
new_var_names(i) = {replace_map(var_names{i})};
end
But I am hoping there is an easier way.
Does MATLAB have anything like a list comprehension in Python?
new_var_names = {replace_map[name] for name in var_names}
Even better if there is a way to handle failed matches:
new_var_names = {replace_map[name] for name in var_names if name in replace_map}
Accepted Answer
More Answers (1)
per isakson
on 1 Feb 2021
With string and arrayfun on R2018b
%%
names_to_replace = ["TonnageDeBSA", "D__bitD___eauAuBSA", ...
"PressionPalierSAG", "PuissanceSAG"];
replacements = ["TonnageBSA", "DebitEauBSA", ...
"PressionPalierSAG", "PuissanceSAG"];
replace_map = containers.Map( names_to_replace, replacements );
%%
var_names = names_to_replace( randi([1,4],1,8) ); % test data
new_names = arrayfun( @(key) replace_map(key), var_names, "uni", false );
reshape( new_names, [],1 )
outputs
ans =
8×1 cell array
{'PuissanceSAG' }
{'DebitEauBSA' }
{'PressionPalierSAG'}
{'TonnageBSA' }
{'PuissanceSAG' }
{'DebitEauBSA' }
{'PressionPalierSAG'}
{'PressionPalierSAG'}
>>
Surprise, I expected a string array as output. containers.Map (R2018b) doesn't seem to fully support strings.
1 Comment
Bill Tubbs
on 1 Feb 2021
Categories
Find more on Structures in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!