Table array with numerical row names
19 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Ken
am 29 Mär. 2018
Kommentiert: Peter Perkins
am 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?
0 Kommentare
Akzeptierte Antwort
Guillaume
am 29 Mär. 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)
0 Kommentare
Weitere Antworten (3)
Sean de Wolski
am 28 Jan. 2019
Bearbeitet: Sean de Wolski
am 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 Kommentare
Emiliano Alexander Carlevaro
am 15 Jan. 2020
Mmmm... It doesn't seem to work anymore...
>> matlab.lang.makeValidName(string(1:10))
Error using matlab.lang.makeValidName (line 72)
First input must be a character vector or cell vector of character
vectors.
Walter Roberson
am 15 Jan. 2020
Emiliano Alexander Carlevaro which release are you using? And have you accidentally defined a variable named string ?
Elias Gule
am 29 Mär. 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);
Peter Perkins
am 29 Mär. 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 Kommentare
math man
am 28 Jan. 2019
For me, the idea is to have a set of Variable names which I can read in from elsewhere (perhaps a vector of 15 to 20 numbers). I'd then like to be able to refer to them. So ideally I'd have a set of variablesnames which I can call dynamically (NOT just assigning 'One', 'Two', etc.), and also which I can refer to for the purposes of Indexing, like in Excel.
so
numbervariablenames = otherarray(1,:)
t = table(somedata,'VariableNames',numbervariablenames)
and I want to be able to do:
Col = find(strcmp(t.VariableNames,num2str(SomeNumber)),1)
ColumnofData_Iwant = t{:,Col}
Note that the earlier solution by Guillame did not work for me, I get this error:
Error using table.init (line 401)
'2.96926' is not a valid variable name.
Error in array2table (line 64)
t = table.init(vars,nrows,rownames,nvars,varnames);
Thanks for any help!
Peter Perkins
am 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
Siehe auch
Kategorien
Mehr zu Characters and Strings finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!