如何将具有混合数据类型的表转换为单个数据类型?

时间:2015-12-16 07:28:46

标签: matlab

我在Matlab中定义了一个表格,它是字符串和整数的混合,即

    A             B         C         D         D
    ----------    ---       ---       ---       ---
    1.0002e+05    '2'       '2'       '1'       '2'   
    1.0002e+05    '2'       '1'       '2'       '2'   
    1.0002e+05    '2'       '2'       '1'       '1'   
    1.0003e+05    '2'       '2'       '2'       '1'   
    1.0003e+05    '2'       '2'       '3'       '1'   

感谢一些数据清理,我知道唯一允许的是整数数据。因此,如何将str2num应用于表格,以便一次更新所有内容?

2 个答案:

答案 0 :(得分:1)

利用dynamic field referencing的替代方法,也适用于表格。

假设您的表T设置如上:

myvarnames = T.Properties.VariableNames;
for ii = 1:length(myvarnames)
    if iscell(T.(myvarnames{ii}))
        % If your table variable contains strings then we will have a cell
        % array. If it's numeric data it will just be in a numeric array
        T.(myvarnames{ii}) = str2double(T.(myvarnames{ii}));
    end
end

我们也可以使用varfun(例如T = varfun(@str2double, T)),但在这种情况下,它会出错,因为并非所有变量都是字符串。我假设是这种情况,但错误信息非常神秘(MATLAB:table:RowDimensionMismatch)。您可以使用try/catch块来捕获此信息,但您可能会遇到传递实际维度不匹配的风险,这是我不喜欢的。如果您明确知道要传递哪些变量,也可以使用InputVariables name-value pair

varfun也烦人地重命名传递的变量。当然,它只需要一个衬垫来修复它,但它仍然很烦人。

答案 1 :(得分:0)

我怀疑可能有更简洁的方法,但假设该表名为data

% Convert the data new table that contains the numeric data
conversion = array2table(cellfun(@str2num, table2cell(data(:, 2:end))));

% Copy the column names over
conversion.Properties.VariableNames = data.Properties.VariableNames(2:end);

% Delete the old columns
data(:, 2:end) = [];

% Concatenate the new table
data = [data conversion];