How to turn NaN values in only numerical columns into -999?
5 次查看(过去 30 天)
显示 更早的评论
I have some data with both numerical and string columns. See attached for an example (aa.xlsx).
It has four columns like this:
Header1 Header2 Header3 Header4
1, 4, -9, ABC123
2, NaN, 0, NaN
5, 6, NaN, ABC789
My goal is to convert any NaN values that are in only numerical columns into -999, while leaving the NaN values in string columns intact. The end results should look like something like this:
Header1 Header2 Header3 Header4
1, 4, -9, ABC123
2, -999, 0, NaN
5, 6, -999, ABC789
Here is the code I know will work, if all of my columns are numerical:
%convert any NaN into -999
T1 = readtable ('aa.xlsx', 'PreserveVariableNames',true)
Ind_table = isnan(T1{:,:});
T1{:,:}(Ind_table) = -999;
How should I modify it so that it won't do the conversion for columns that are made up of strings?
Many thanks!
0 个评论
采纳的回答
Adam Danz
2019-10-17
编辑:Adam Danz
2019-10-17
When you create your table, the missing values in the Header4 column will not appear as NaNs since that column contains character arrays. Instead, they will just be an empty char array. A very annoying thing with tables is that they do not support subscript indexing. So the solution below converts the table to a cell array, replace the NaN values in numeric columns, and then puts the cell array back into a table with matching properties as your original table.
T1 = readtable ('aa.xlsx', 'PreserveVariableNames',true);
T1cell = table2cell(T1);
isnum = varfun(@isnumeric,T1,'output','uniform'); % ID columns that are numeric
ismiss = ismissing(T1); % find missing values
T1cell(ismiss & isnum) = {-999};
T1New = cell2table(T1cell);
T1New.Properties = T1.Properties; % your new table with NaN replacement
Result
T1New =
3×4 table
Header1 Header2 Header3 Header4
_______ _______ _______ __________
1 4 -9 {'ABC123'}
2 -999 0 {0×0 char}
5 6 -999 {'ABC789'}
更多回答(2 个)
Sebastian Bomberg
2019-10-17
You can have fillmissing apply only to the numeric variables directly:
fillmissing(T1,"constant",-999,"DataVariables",@isnumeric)
Walter Roberson
2019-10-17
fillmissing(T1,'constant',{-999,-999,-999,'NaN'})
Note that this will use the character vector 'NaN' (three characters) in place of the numeric NaN entries in column 4, as it is not possible to have numeric entries in a column devoted to character vectors.
5 个评论
另请参阅
类别
在 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!