How to round values of table with mixed types?

16 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]}

Categories

Find more on Tables in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!