0

我有两个不同的双变量,每个变量有一列和 30000 行。例如:

A=[53
76
41
74
34
237
43…]

B= [1985
1985
1985
…
1986
1986
…
2013…]

如果我做:

size(unique(A),1)
ans =261
size(unique(B),1)
ans = 27

但是当我这样做时:

D1=dummyvar(A)

我得到一个包含 355 列和 30000 行 1 和 0 的双矩阵,这意味着 Matlab 已经识别出 355 个不同的虚拟对象而不是 261 个。

和,

D2=dummyvar(B)

我也得到了 2012 列的双倍,这也是不正确的。

Matlab 正在按预期在我的分类列中识别出更多的假人,所以我一定做错了什么,但我不知道是什么,因为以前这个公式对我有用。有人能帮助我吗?谢谢你。

4

2 回答 2

2

的列数dummyvar(A)max(A)。这个例子应该澄清:

>> A = [1;2;2;5]
A =
     1
     2
     2
     5
>> unique(A)
ans =
     1
     2
     5
>> dummyvar(A)
ans =
     1     0     0     0     0
     0     1     0     0     0
     0     1     0     0     0
     0     0     0     0     1

如果您想避免那些全零列,请使用第三个输出unique来“消除间隙” A然后应用dummyvar

>> A = [1;2;2;5]
A =
     1
     2
     2
     5
>> [~, ~, uA] = unique(A)
uA =
     1
     2
     2
     3
>> dummyvar(uA)
ans =
     1     0     0
     0     1     0
     0     1     0
     0     0     1
于 2014-08-21T15:03:43.953 回答
2

也许这个功能会有用

function [result, columnNames] = dummyvarSmart(x)
    [columnNames, ~, indices] = unique(x);
    result = dummyvar(indices);
    columnNames = transpose(columnNames);
end

你可以像这样使用它

>> B = sort(1983 + randi(30, 1000, 1));
>> min(B)
ans =
        1984
>> max(B)
ans =
        2013
>> [result, names] = dummyvarSmart(B);
>> size(result)
ans =
        1000        30
>> names(1:5)
ans =
        1984        1985        1986        1987        1988
于 2014-08-21T15:37:10.663 回答