# Table array with numerical row names

79 views (last 30 days)
Ken on 29 Mar 2018
Commented: Peter Perkins on 28 Jul 2020
I'm trying to create a table array where the row names are a vector of doubles, but row names are required to be a cell array of strings. How would someone do this?

Guillaume on 29 Mar 2018
Convert your numbers to a cell array of char array (strings are not supported strangely). If the vector of numbers is all integers:
rownames = compose('%d', yourvector);
If it's real numbers then specify the appropriate format string in compose or matlab let do its thing with:
rownames = cellstr(string(yourvector));
Then create your table whichever way you were going to use, e.g.:
t = array2table(somearray, 'RowNames', rownames)

Sean de Wolski on 28 Jan 2019
Edited: Sean de Wolski on 28 Jan 2019
You could use matlab.lang.makeValidName to make valid names for each one. However, for the numeric case, this just adds x so you could do that directly and choose another letter or word, perhaps r or row:
matlab.lang.makeValidName(string(1:10))
ans =
1×10 string array
"x1" "x2" "x3" "x4" "x5" "x6" "x7" "x8" "x9" "x10"
Or
"r"+(1:10)
##### 2 CommentsShowHide 1 older comment
Walter Roberson on 15 Jan 2020
Emiliano Alexander Carlevaro which release are you using? And have you accidentally defined a variable named string ?

Elias Gule on 29 Mar 2018
Convert your vector of strings to a cell array of strings.
v = 1 : 20; % replace with your vector
row_names = arrayfun(@num2str,v,'uni',0);
Guillaume on 29 Mar 2018
strings are actually not supported for row names. The cell array must contain char vectors
Note that the above does create a cell array of char vectors, not strings.

Peter Perkins on 29 Mar 2018
The variable names in a table not only need to be text, they also need to be valid MATLAB identifiers (as do the field names in a struct). So while you might think to do this ...
>> t = table([1;2;3],[4;5;6],'VariableNames',{'1' '2'})
Error using table (line 307)
'1' is not a valid variable name.
... you can't. But hang on a minute - create this table:
>> t = table([1;2;3],[4;5;6],'VariableNames',{'one' 'two'})
t =
3×2 table
one two
___ ___
1 4
2 5
3 6
Now index into it using the numbers you'd like to have as the variable names:
>> t(:,1:2)
ans =
3×2 table
one two
___ ___
1 4
2 5
3 6
>> t{:,1:2}
ans =
1 4
2 5
3 6
and even
>> t.(1)
ans =
1
2
3
What is it that you can't do right now, except have '1' displayed as the name?
##### 2 CommentsShowHide 1 older comment
Peter Perkins on 28 Jul 2020
In one of the 2019 releases (I forget which), the requirement that table/timetable variable names be valid MATLAB identifiers was relaxed. So this
>> t = array2table(rand(5,3),'VariableNames',["1" "2 2" "(3)"])
t =
5×3 table
1 2 2 (3)
________ _______ _______
0.69875 0.47992 0.80549
0.19781 0.90472 0.57672
0.030541 0.60987 0.18292
0.74407 0.61767 0.23993
0.50002 0.85944 0.88651
is a legal table now. Of course, to access those variables, t.1 or t.2 2 isn't gonna work, so you need to do this:
>> t.("1")
ans =
0.69875
0.19781
0.030541
0.74407
0.50002