How to round values of table with mixed types?

14 views (last 30 days)
I would like to round all values in given columns, but get the error To assign to or create a variable in a table, the number of rows must match the height of the table.
I have attached a photo of the workspace variable of the table, only want to round certain rows as others have values which are unable to round
varnames={'Set Temp','duration','Start Temp','Time to Temp','Time to Steady','overshoot'};
for k=1:height(MasterTable)
for m=1:length(varnames)
varname=varnames{m};
MasterTable{k,varname}=mat2cell(round(cell2mat(MasterTable{k,varname})),3);
end
end
  2 Comments
dpb
dpb on 1 Feb 2023
'Set Temp' appears to be integer-valued already excepting you've got some locations that contain an array instead of a single value. Why is that; that'll screw up trying to do anything with the variable. Fix the data design first, then you can simply write
t.(varname)=round(t.(varname));
and be done.
Nicholas Kavouris
Nicholas Kavouris on 2 Feb 2023
Some cycles have more than one set temp, this is not a viable solution as this data design is necessary information to my programs outputs

Sign in to comment.

Answers (2)

Steven Lord
Steven Lord on 2 Feb 2023
Using a sample table:
Temp = [37.3;39.1;42.3];
Pressure = [30.1;30.03;29.9];
WindSpeed = [13.4;6.5;7.3];
WindDirection = categorical({'NW';'N';'NW'});
T = table(Temp,Pressure,WindSpeed,WindDirection)
T = 3×4 table
Temp Pressure WindSpeed WindDirection ____ ________ _________ _____________ 37.3 30.1 13.4 NW 39.1 30.03 6.5 N 42.3 29.9 7.3 NW
Let's round all the numeric variables.
T2 = varfun(@round, T, 'InputVariables', @isnumeric)
T2 = 3×3 table
round_Temp round_Pressure round_WindSpeed __________ ______________ _______________ 37 30 13 39 30 7 42 30 7
We can see which variables from T were used in the varfun computation.
areNumeric = varfun(@isnumeric, T, 'OutputFormat', 'uniform')
areNumeric = 1×4 logical array
1 1 1 0
We could use those to overwrite the contents of T with T2. I'm going to make a backup copy of the original T for use in one more step.
T3 = T;
T(:, areNumeric) = T2
T = 3×4 table
Temp Pressure WindSpeed WindDirection ____ ________ _________ _____________ 37 30 13 NW 39 30 7 N 42 30 7 NW
If you only want to round some of the values, specify InputVariables differently.
v = [true false true false];
T4 = varfun(@round, T3, 'InputVariables', v); % leave Pressure alone
T3(:, v) = T4
T3 = 3×4 table
Temp Pressure WindSpeed WindDirection ____ ________ _________ _____________ 37 30.1 13 NW 39 30.03 7 N 42 29.9 7 NW

Voss
Voss on 2 Feb 2023
If those columns that contain numeric values are cell arrays, as in
FW = ["EVT64"; "EVT64"; "EVT64"];
SetTemp = {[400;225]; [203;194]; 450};
Duration = {104.95; 264.15; 29.9833};
MasterTable = table(FW,SetTemp,Duration)
MasterTable = 3×3 table
FW SetTemp Duration _______ ____________ ____________ "EVT64" {2×1 double} {[104.9500]} "EVT64" {2×1 double} {[264.1500]} "EVT64" {[ 450]} {[ 29.9833]}
then you can modify your code as follows:
varnames = {'SetTemp','Duration'};
for k=1:height(MasterTable)
for m=1:length(varnames)
varname=varnames{m};
% MasterTable{k,varname}=mat2cell(round(cell2mat(MasterTable{k,varname})),3);
MasterTable.(varname){k} = round(MasterTable.(varname){k});
end
end
MasterTable
MasterTable = 3×3 table
FW SetTemp Duration _______ ____________ ________ "EVT64" {2×1 double} {[105]} "EVT64" {2×1 double} {[264]} "EVT64" {[ 450]} {[ 30]}

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!