Round all values in table

Hi,
I have a table with calculated values. Now I want to round all values to 2 decimals. How can I do that in once for the whole table?

回答(2 个)

I think this achieves what you are after:
% test data
T1 = array2table(rand(5))
T1 = 5×5 table
Var1 Var2 Var3 Var4 Var5 _________ _______ _______ ________ ________ 0.0024079 0.97172 0.41667 0.027209 0.079337 0.14919 0.17995 0.58257 0.46413 0.99968 0.56165 0.79083 0.06821 0.18682 0.23824 0.31412 0.6835 0.82666 0.49151 0.12438 0.78186 0.66873 0.07059 0.86243 0.32011
% rounded to 2 decimal places
T2 = array2table(round(T1{:,:},2))
T2 = 5×5 table
Var1 Var2 Var3 Var4 Var5 ____ ____ ____ ____ ____ 0 0.97 0.42 0.03 0.08 0.15 0.18 0.58 0.46 1 0.56 0.79 0.07 0.19 0.24 0.31 0.68 0.83 0.49 0.12 0.78 0.67 0.07 0.86 0.32
Another solution using varfun()
% test data
T = array2table(rand(5))
T = 5×5 table
Var1 Var2 Var3 Var4 Var5 __________ _________ _________ ________ ________ 0.10584 0.27303 0.0067048 0.58837 0.063311 0.45211 0.12874 0.22154 0.4381 0.57343 0.59635 0.64793 0.89923 0.64467 0.48561 0.75997 0.0090159 0.33324 0.42146 0.60051 0.00011342 0.11944 0.35647 0.059849 0.066758
% round data in table to 2 d.p.
varfun(@(x)round(x,2), T)
ans = 5×5 table
Fun_Var1 Fun_Var2 Fun_Var3 Fun_Var4 Fun_Var5 ________ ________ ________ ________ ________ 0.11 0.27 0.01 0.59 0.06 0.45 0.13 0.22 0.44 0.57 0.6 0.65 0.9 0.64 0.49 0.76 0.01 0.33 0.42 0.6 0 0.12 0.36 0.06 0.07
The only difference is the variable names.

4 个评论

If you use the varfun() option InputVariables=@numeric then you can have the rounding apply only to the numeric portions of the table.
However, variables not selected by the @isnumeric will simply not appear in the output table, and the variables that do appear will have 'round_' as a prefix. This is not exactly the most convenient for post-processing.
Another approach is to create a helper function along the lines of
function out = conditional_round2(in)
if isnumeric(in)
out = round(in,2);
else
out = in;
end
end
and then
new_T = varfun(@conditional_round2, T);
new_T.Properties.VariableNames = regexprep(T.Properties.VariableNames, '^[^_]*_', '', 'once');
Thanks very much, I had no idea about the InputVariables option to varfun(), something I definitely could have used in the past!
What about this, still using varfun():
% test data
t = table(rand(5,1), repelem("a",5,1))
t = 5×2 table
Var1 Var2 ________ ____ 0.4024 "a" 0.21798 "a" 0.070511 "a" 0.1205 "a" 0.72754 "a"
% round data in table to 2 d.p.
t(:,"Var1") = varfun(@(x)round(x,2), t, InputVariables=@isnumeric)
t = 5×2 table
Var1 Var2 ____ ____ 0.4 "a" 0.22 "a" 0.07 "a" 0.12 "a" 0.73 "a"
The other method, whilst also good, for me coming up with that regex pattern is still a mental speedbump. However, I can see an extension to conditionalRound. I would call it a conditionalFunction, and should you want to say round to 2 d.p. if is column is numeric, do something else if isstring e.g.
function out = conditionalFunction(in)
if isnumeric(in)
out = round(in,2);
elseif isstring(in)
% do something to strings
else
out = in;
end
end
That's an interesting use of table assignment.
Needs more work if there could be multiple output variables.
t = table(rand(5,1), rand(5,1), repelem("a",5,1))
t = 5×3 table
Var1 Var2 Var3 _______ _______ ____ 0.89086 0.66185 "a" 0.83846 0.33959 "a" 0.78412 0.42468 "a" 0.34779 0.68343 "a" 0.49041 0.28647 "a"
outvars = t.Properties.VariableNames(varfun(@isnumeric,t,OutputFormat="uniform"))
outvars = 1×2 cell array
{'Var1'} {'Var2'}
t(:,outvars) = varfun(@(x)round(x,2), t, InputVariables=outvars)
t = 5×3 table
Var1 Var2 Var3 ____ ____ ____ 0.89 0.66 "a" 0.84 0.34 "a" 0.78 0.42 "a" 0.35 0.68 "a" 0.49 0.29 "a"
And here it is wrapped up in a function.
Awesome! I feel like with some documentation it might be worth putting on the file exchange?
t = table(rand(5,1), rand(5,1), repelem("a",5,1))
t = 5×3 table
Var1 Var2 Var3 _______ ________ ____ 0.45139 0.33976 "a" 0.6767 0.59527 "a" 0.46407 0.070445 "a" 0.87703 0.88928 "a" 0.30553 0.68711 "a"
conditionalVarfun(t, @isnumeric, @(x)round(x,2))
ans = 5×3 table
Var1 Var2 Var3 ____ ____ ____ 0.45 0.34 "a" 0.68 0.6 "a" 0.46 0.07 "a" 0.88 0.89 "a" 0.31 0.69 "a"
%% functions
function t = conditionalVarfun(t, fh_condition, fh_operation)
% t (table)
% fh_condition e.g. @isnumeric
% fh_operation e.g. @(x)round(x,2)
p = inputParser;
p.addRequired("t", @istable)
p.addRequired("fh_condition", @isfunctionhandle)
p.addRequired("fh_operation", @isfunctionhandle)
p.parse(t, fh_condition, fh_operation)
t = p.Results.("t");
fh_condition = p.Results.("fh_condition");
fh_operation = p.Results.("fh_operation");
outvars = t.Properties.VariableNames(varfun(fh_condition,t,OutputFormat="uniform"));
t(:,outvars) = varfun(fh_operation, t, InputVariables=outvars);
end
function bool = isfunctionhandle(x)
bool = isa(x, 'function_handle');
end

请先登录,再进行评论。

类别

帮助中心File Exchange 中查找有关 Logical 的更多信息

产品

版本

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by