Splitting cell array of both strings and numbers by a delimiter

5 views (last 30 days)
Hello,
I have a cell array that consists of both strings and numbers. I need to split into two different columns by the delimiter '~' However, I am not able to use regexp, as the cell array must all be strings. And I can't use num2str or str2num because half are strings and half are numbers, and it creates an error message. I am attaching my .mat file so you may get an idea of what I'm working with.
Please let me know what I can do to split this cell array into two different columns by the delimiter '~' For the elements that are NaN, I would like both columns to say NaN
Thank you for your help,
Melissa
  3 Comments
Melissa
Melissa on 11 Dec 2014
I found the way to change the numbers into strings! I had to use cellfun but with the uniform output changed to false :
Depthcm = cellfun(@num2str, Depthcm,'UniformOutput','false');
Now I have a cell array of strings, and I can now use regexp. However, I am a bit confused about how I can split them into two separate columns while also including the NaN's. Because if I split it with this line:
Y = regexp(Depthcm,'\~','split');
I get a 1x2 cell within each of the Y elements, except for the NaN indices.
Therefore, I would like two columns like this:
A = [0 0 0 NaN 2 NaN NaN]; B = [20 20 5 NaN 4 NaN NaN];
Guillaume
Guillaume on 11 Dec 2014
If you've changed the NaN into a single string, then you're back to your previous question.
Or you can do what I've done in my answer below.
In any case, when processing data, it is better to always generate that data in a consistent way. In your case, that means always have string consisting of two numbers surrounding ~, even if these numbers are NaN. That is, you would have been better off writing 'NaN~NaN' in your cell array instead of 'NaN' or NaN.
Side note: there's no need to escape ~ in the regular expression. I'm surprised matlab accepts it.

Sign in to comment.

Accepted Answer

Guillaume
Guillaume on 11 Dec 2014
The simplest thing would be to convert these NaNs into strings of 'NaN~NaN' and then use the same algorithm as in my previous answer to convert the cell array:
Depthcm(cellfun(@(x) isnumeric(x) && isnan(x), Depthcm)) = {'NaN~NaN'};
splitdepth = regexp(Depthcm, '~', 'split');
bounds = str2double(vertcat(splitdepth{:}));
  1 Comment
Melissa
Melissa on 11 Dec 2014
Yes! that is exactly what I was looking for!
Much easier and logical than my previous comment :)
Thank you so much

Sign in to comment.

More Answers (0)

Categories

Find more on Characters and Strings in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!