CONTEXT
我有大量带有分类的列,所有列都有不同的,不可思议的选择。为了让我的生活更容易进行分析,我想把它们中的每一个都转换成带有逻辑的几列。例如:
1 GENRE
2 Pop
3 Classical
4 Jazz
......会变成......
1 Pop Classical Jazz
2 1 0 0
3 0 1 0
4 0 0 1
问题
我尝试过使用ind2vec
,但这仅适用于数字或逻辑。我也遇到this,但我不确定它是否适用于分类。在这种情况下使用什么是正确的功能?
答案 0 :(得分:3)
如果您想要从categorical向量转换为logical array,可以使用unique
函数生成列索引,然后使用any of the options from this related question执行编码:
% Sample data:
data = categorical({'Pop'; 'Classical'; 'Jazz'; 'Pop'; 'Pop'; 'Jazz'});
% Get unique categories and create indices:
[genre, ~, index] = unique(data)
genre =
Classical
Jazz
Pop
index =
3
1
2
3
3
2
% Create logical matrix:
mat = logical(accumarray([(1:numel(index)).' index], 1))
mat =
6×3 logical array
0 0 1
1 0 0
0 1 0
0 0 1
0 0 1
0 1 0
答案 1 :(得分:1)
ind2vec可以处理单元格字符串,您可以调用cellstr函数来获取这样的单元格字符串。
此代码可能会有所帮助(来自this,我只改变了一点)
data = categorical({'Pop'; 'Classical'; 'Jazz';});
GENRE = cellstr(data); %change categorical data into cell strings
[~, loc] = ismember(GENRE, unique(GENRE));
genre = ind2vec(loc')';
Gen=full(genre);
array2table(Gen, 'VariableNames', unique(GENRE))
运行这样的代码将返回此:
ans =
Classical Jazz Pop
_________ ____ ___
0 0 1
1 0 0
0 1 0
您可以调用 unique(GENRE)来检查类别(在单元格字符串中)。同时,逻辑(Gen)(或调用逻辑(完整(流派)))包含您需要的逻辑列。
P.S。分类结构可能比单元格字符串更快,但ind2vec函数不能使用它。 unique 和 accumarray 可能会更好。