Hello. Could anyone tell me how to fix the for-loop code?
>>
b = {'Hello world'; 'Good morning';'Good afternoon';'6 years';'10+ years';'<1 year'}
z=array2table(b,'VariableNames', {'var1'})
for i=1:length(z)
if z(i,1)='Hello world'; z(i,1)=1;
else z(i,1)=0;
end
end
Output:
b =
6×1 cell array
{'Hello world' }
{'Good morning' }
{'Good afternoon'}
{'6 years' }
{'10+ years' }
{'<1 year' }
z =
6×1 table
var1
__________________
{'Hello world' }
{'Good morning' }
{'Good afternoon'}
{'6 years' }
{'10+ years' }
{'<1 year' }
if z(i,1)='Hello world'; z(i,1)=1;
Incorrect use of '=' operator. Assign a value to a variable using '=' and compare values for equality using '=='.

 Accepted Answer

Do exactly this:
compare values for equality using '=='
However the actual solution is likely the strcmp (or related strcmpi) function.
Try this:
b = {'Hello world'; 'Good morning';'Good afternoon';'6 years';'10+ years';'<1 year'}
z=array2table(b,'VariableNames', {'var1'})
for i=1:height(z)
if strcmp(z{i,1}, 'Hello world'); z{i,1}={1};
else z{i,1} = {0};
end
end
Indexing correctly (here using curly braces {}) is important.

2 Comments

Star Strider, Thank you for pointing strcmp to me - it is very useful. Code that you suggest works after a slight adjustment. Thank you.
b = {'Hello world'; 'Good morning';'Good afternoon';'6 years';'10+ years';'<1 year'}
z=array2table(b,'VariableNames', {'var1'})
for i=1:height(z)
if strcmp(z{i,1}, 'Hello world')==1; z{i,1}={1};
else z{i,1} = {0};
end
end
My pleasure!

Sign in to comment.

More Answers (1)

DGM
DGM on 23 Apr 2021
Edited: DGM on 23 Apr 2021
You need to use == for equality tests, not =. That said, don't try testing character arrays for equality that way either. Unless they have the same number of characters, you'll have problems. Use strcmp(), strcmpi(), or ismember().
b = {'Hello world'; 'Good morning';'Good afternoon';'6 years';'10+ years';'<1 year';'0'}
z=array2table(b,'VariableNames', {'var1'})
for i=1:height(z) % use height/width/size/numel, not length
if strcmp(z{i,'var1'},'Hello world'); % use curly braces for indexing here. you can either use column number or name
z{i,'var1'}={'1'}; % i'm assuming that elements of a table column should share the same datatype
elseif strcmp(z{i,'var1'},'0'); % if there's a condition, use elseif instead of else
z{i,'var1'}={'something else'};
else
% do something else
end
end
z % see what changed
gives
z =
var1
________________
'Hello world'
'Good morning'
'Good afternoon'
'6 years'
'10+ years'
'<1 year'
'0'
z =
var1
________________
'1'
'Good morning'
'Good afternoon'
'6 years'
'10+ years'
'<1 year'
'something else'
I added an extra element to your list so that the second case was demonstrated.

4 Comments

Dear DGM, Thank you for your reply. Do you if it matters if I use {'1'} vs {1} in ie.,
{i,'var1'}={'1'} vs {i,'var1'}={'1'} ?
Whihc option will make sure that the cell entry is a number?
DGM
DGM on 23 Apr 2021
if you use {1}, you're inserting a numeric value. If you use {'1'}, you're inserting a string. As I mentioned in the comments, a column in a table typically contains data of one type. There's nothing stopping you from mixing datatypes though. It all depends on what you want to do.
Dear, DGM. I understand. I want it to look like this., but Instead I get something like this
i need it to ne numerical so I can run the regression.

Sign in to comment.

Tags

Community Treasure Hunt

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

Start Hunting!