Convert multiple Table Variables from Cell to Double

조회 수: 11 (최근 30일)
Greg Perlman
Greg Perlman 2021년 1월 26일
댓글: Cris LaPierre 2021년 1월 27일
I have a table with many variables of mixed types (some strings, some numbers). The first X variables should be double/numeric, but they are cell arrays and in each cell the number is bounded by single quotes ({'2.496' }, {'6.675' } ,{'9.644' }, etc). I can convert the X columns to double one at at time.
T.bin1 = str2double(T.bin1);
T.bin2 = str2double(T.bin2);
...
T.binX = str2double(T.binX);
I checked the output: T.bin1 is a 167x1 cell array. str2double turns it into a 167x1 double. This single command methods works fine. But, I'm having trouble generalizing the code to a situation where I saved table names: HoldNames = T.Properties.VariableNames([1:X]);
This will work, but it's one at a time:
T.bin1 = str2double(table2cell(T(:,HoldNames(:,1)))) %a 167x1 double assigned into a 167 x1 Table
T.bin2 = str2double(table2cell(T(:,HoldNames(:,2))))
...
T.binX = str2double(table2cell(T(:,HoldNames(:,X))))
However, these do not work:
%a 167xX double assigned into a 167xX Table
T(:,HoldNames) = str2double(table2cell(T(:,HoldNames))) %Right hand side of an assignment into a table must be another table or a cell array.
%a 167xX double assigned into a 167xX cell array
T{:,HoldNames} = str2double(table2cell(T(:,HoldNames))) %Conversion to cell from double is not possible.

답변 (1개)

Cris LaPierre
Cris LaPierre 2021년 1월 27일
I was able to get the following dummy example to work.
% Create table of cells
var = num2cell(rand(4,3));
var = cellfun(@num2str,var,'UniformOutput',false);
T = splitvars(table(var))
T = 4x3 table
var_1 var_2 var_3 ____________ ___________ ____________ {'0.15345' } {'0.44518'} {'0.93558' } {'0.095759'} {'0.86483'} {'0.55891' } {'0.081027'} {'0.92421'} {'0.068477'} {'0.95817' } {'0.35516'} {'0.076722'}
% Convert Var_2 and Var_3 to double (still cells)
HoldNames=["var_2","var_3"];
T{:,HoldNames} = table2cell(varfun(@str2double,T,'InputVariables',HoldNames))
T = 4x3 table
var_1 var_2 var_3 ____________ __________ __________ {'0.15345' } {[0.4452]} {[0.9356]} {'0.095759'} {[0.8648]} {[0.5589]} {'0.081027'} {[0.9242]} {[0.0685]} {'0.95817' } {[0.3552]} {[0.0767]}
  댓글 수: 1
Cris LaPierre
Cris LaPierre 2021년 1월 27일
I don't like that they are still cells. This approach isn't pretty, but it's the first way I found to change that.
% Create table of cells
var = num2cell(rand(4,3));
var = cellfun(@num2str,var,'UniformOutput',false);
T = splitvars(table(var))
T = 4x3 table
var_1 var_2 var_3 ___________ ___________ ___________ {'0.68742'} {'0.25061'} {'0.41257'} {'0.60281'} {'0.30769'} {'0.98267'} {'0.23292'} {'0.70099'} {'0.93851'} {'0.26057'} {'0.43727'} {'0.65197'}
% Convert Var_2 and Var_3 to double (as arrays)
HoldNames=["var_2","var_3"];
T_temp = varfun(@str2double,(varfun(@string,T(:,HoldNames))));
T(:,HoldNames)=[];
T(:,HoldNames)=T_temp
T = 4x3 table
var_1 var_2 var_3 ___________ _______ _______ {'0.68742'} 0.25061 0.41257 {'0.60281'} 0.30769 0.98267 {'0.23292'} 0.70099 0.93851 {'0.26057'} 0.43727 0.65197

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Data Type Conversion에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by