Converting Categorical Array/Table to Numerical
58 ビュー (過去 30 日間)
古いコメントを表示
Hello!
I have a 23000x4 set of data that is a table (called temp). It is all numbers except for the times data was missing it was filled in with 'NA', therefore the table is categorial. I am looking to change it to a numerical and have all the 'NA' changed to 'NaN' so I can run max and min and those kinds of things on it without running into issues. Thank you for the help!
12 件のコメント
Adam Danz
2020 年 6 月 10 日
What function did you use to import it? You can control the class of the data you're importing. A csv file doesn't control that for numeric values.
採用された回答
Adam Danz
2020 年 6 月 10 日
編集済み: Adam Danz
2022 年 9 月 23 日
By far the best solution is to avoid representing numeric values as categorical values in the first place. If you can un-do that, that's the best solution.
If that cannot be done, here's how to convert categorical values that contain numeric values in a table.
Table T can contain mixed classes (some classes may cause errors).
This demo detects which columns of T contains values that can be converted to numers. It then creates an output table T_converted that contains the num-categorical-number columns of T and the categorical-number columns converted to numbers.
% Create demo table with a mix of stings, categorical numerals, and numbers
T = table(["A";"B";"C";"D";"E"], ...
categorical(randi(10,5,1)), ...
randi(10,5,1), ...
categorical(randi(10,5,1)), ...
'VariableNames', {'A','B','C','D'})
varfun(@class, T)
% Determine which columns are categoricals
% NOTE: This assumes you want to convert all categorical table variables
% to numeric. Otherwise, additional column indexing will be needed.
iscat = varfun(@iscategorical, T,'OutputFormat','Uniform');
% Convert the categorical table variables to numeric
Tnum = array2table(str2double(string(T{:,iscat})), ...
'VariableNames', T.Properties.VariableNames(iscat));
% Create an updated table with the converted data and maintain
% original column order
T_converted = [T(:, ~iscat), Tnum];
[~,colorder] = ismember(T_converted.Properties.VariableNames, T.Properties.VariableNames);
T_converted(:,colorder)
varfun(@class, T_converted)
This answer was corrected on 9/23/22; thanks to Ahmed Rady for pointing out the problem
2 件のコメント
Ahmed Rady
2022 年 9 月 23 日
編集済み: Ahmed Rady
2022 年 9 月 23 日
Hi Adam
Thanks for the code
But it seems that the numeric values in the original table were transformed.
I thought the aim is to only change the catergorical variables.
Adam Danz
2022 年 9 月 23 日
My previous answer involved applying double() to the categorical-numbers which converts the categoricals into a grouping number rather than the numbers represented within the categories.
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Data Type Conversion についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!