I have a large table (large number of columns and very large number of rows), many of these columns contain simple cell arrays with a very limited number of different options (such as 'ON" and 'OFF' or similar).

I would like to convert all these columns to categorical in an automated way, i.e. extracting column names from

`Table.Properties.VariableNames`

and not explicitly writing the (large) number of column names in dot notation.

I have seen that

`>> ddd2 = categorical(MyTable{:,MyTable.Properties.VariableNames(1)});`

works fine (i.e. ddd2 is a correct categorical array), but, at this point, I cannot put this categorical array back in my table. I tried:

`>> MyTable{:,MyTable.Properties.VariableNames{1}}= ddd2;The following error occurred converting from categorical to cell:Conversion to cell from categorical is not possible.`

but it returns the error you see above… On the other hand, if I use dot notation it works fine, i.e.

`MyTable.Column1 = ddd2;`

yields the desired results. I found a workaround, that works perfectly, but I would like to know if there is a more direct and elegant way to solve this problem…. this is the workaround:

`sz0=size(MyTable);kk=0;for( i=1:sz0(2) ) if( iscell(MyTable{:,i}) ) ddd2 = categorical(MyTable{:,MyTable.Properties.VariableNames(i)}); eval(sprintf('MyTable.%s = ddd2;',MyTable.Properties.VariableNames{i})); kk = kk+1; endendfprintf( ' %d columns transformed to categorical\n', kk );`

it works…

## Best Answer