Creating dummy variables from categorical variable
7 次查看(过去 30 天)
显示 更早的评论
Suppose there is a column vector array n containing unique but repeating values of the form
1
1
5
7
7
The aim is to create a matrix D which contains in its columns dummy variables for each unique value in n of the form
1 0 0
1 0 0
0 1 0
0 0 1
0 0 1
I use the following code:
uniq = unique(n);
N_obs = size(n,1);
N_ind = size(uniq,1);
D = NaN(N_obs,N_ind);
D(:,1) = n == uniq(1,1);
D(:,2) = n == uniq(2,1);
D(:,3) = n == uniq(3,1);
This produces the desired D matrix. However, it is tedious to write the last three lines so I wanted to use a for loop of the form
for i = N_ind
D(:,i) = n == uniq(i,1);
end
But this gives
NaN NaN 0
NaN NaN 0
NaN NaN 0
NaN NaN 1
NaN NaN 1
Where is my mistake in the loop?
0 个评论
采纳的回答
更多回答(3 个)
Stephen23
2017-9-24
Vectorized:
>> vec = [1,1,5,7,7];
>> [~,~,idc] = unique(vec);
>> siz = [numel(idc),max(idc)];
>> out = zeros(siz);
>> out(sub2ind(siz,1:siz(1),idc)) = 1
out =
1 0 0
1 0 0
0 1 0
0 0 1
0 0 1
>>
Guillaume
2017-9-24
Another shorter vectorised option (possibly no faster than Stephen's, I haven't tested):
[~, ~, col] = unique(vec);
out = accumarray([find(col), col], 1) %only purpose of the find is to generate (1:numel(col))'
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!