MATLAB Answers

Ken
0

Table array with numerical row names

Ken
さんによって質問されました 2018 年 3 月 29 日
最新アクティビティ Sean de Wolski
さんによって 編集されました 2019 年 1 月 28 日
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 件のコメント

サインイン to comment.

4 件の回答

Guillaume
回答者: Guillaume
2018 年 3 月 29 日
 採用された回答

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 件のコメント

サインイン to comment.


Sean de Wolski
回答者: Sean de Wolski
2019 年 1 月 28 日
編集済み: Sean de Wolski
2019 年 1 月 28 日

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)

  0 件のコメント

サインイン to comment.


Elias Gule
回答者: Elias Gule
2018 年 3 月 29 日

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);

  1 件のコメント

Guillaume
2018 年 3 月 29 日
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.

サインイン to comment.


Peter Perkins
回答者: Peter Perkins
2018 年 3 月 29 日

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?

  1 件のコメント

math man
2019 年 1 月 28 日
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!

サインイン to comment.



Translated by