如何将元胞数组中的字符串转换为数字替代值?

How to convert strings in a cell array to numerical stand-in values?

在 Matlab 中,我在制表符分隔的数据文件中使用 textscan 创建了一个元胞数组。数据集的某些列是字符串。这是一个示例数组,'data':

data{1,1} = {1; 2; 3; 4; 5};
data{1,2} = {11; 12; 13; 14; 15};
data{1,3} = {'Ringo'; 'Paul'; 'The Beatles'; 'John'; 'George'};

我想将字符串列转换为 特定的 数值替代值(即 'The Beatles' = 1,'John' = 2, 'Paul' = 3, 'George' = 4, 'Ringo' = 5). 此外,可能需要注意的是,某些单元格包含多个 "word".

对于某些上下文,整个数据集最终将从元胞数组转换为一个整齐打包的双数组 (data = cell2mat(data)),以便于操作。

我知道的唯一解决方案是遍历字符串数组并使用 switch 语句:

vec_0 = data{1,3};
for ii = 1:length(vec_0)
    switch vec_0{ii}
        case 'The Beatles'
            vec_f{ii,1} = 1;
        case 'John'
            vec_f{ii,1} = 2;
        case 'Paul'
            vec_f{ii,1} = 3;
        case 'George'
            vec_f{ii,1} = 4;
        case 'Ringo'
            vec_f{ii,1} = 5;
    end
end

% Replace string column with numerical stand-ins
data{1,3} = vec_f;

% Convert cell array to double array
data = cell2mat(data);

现在我们有:

data = [1 11 5; 2 12 3; 3 13 1; 4 14 2; 5 15 4];

执行此操作的最佳方法是什么?

如果您有字符串到数值的特定映射...

假设您有一个字符串到数值的映射,如以下 5×2 元胞数组(每行一个映射)中所定义:

numMap = {'The Beatles', 1; 'John' , 2; 'Paul' , 3; 'George' , 4; 'Ringo' , 5};

然后您可以使用 ismember 将字符串转换为其映射的数值并将其保存回 data,如下所示:

[~, index] = ismember(data{1, 3}, numMap(:, 1));
data{1, 3} = numMap(index, 2);

如果您需要生成字符串到数值的映射...

您可以使用 unique, convert that to a cell array with num2cell 生成一个数字替代数组,然后像这样将其保存回 data

[uniqueStrings, ~, numIndex] = unique(data{1, 3}, 'stable');
data{1, 3} = num2cell(numIndex);

uniqueStrings 将包含来自 data{1, 3} 的唯一多词字符串。

转换为双精度数组:

一旦您选择了上述选项之一,您就可以将示例数据转换为 5×3 双精度数组,如下所示:

data = cell2mat([data{:}]);

data =
     1    11     5
     2    12     3
     3    13     1
     4    14     2
     5    15     4