【问题标题】:Apply dummyvar function in Matlab在 Matlab 中应用 dummyvar 函数
【发布时间】:2014-10-15 06:37:32
【问题描述】:

我有两个不同的双变量,每个变量有一列和 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 按预期在我的分类列中识别出更多的假人,所以我一定做错了什么,但我不知道是什么因为以前这个公式对我有用。有人能帮助我吗?谢谢。

【问题讨论】:

    标签: matlab double dummy-data


    【解决方案1】:

    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
    

    【讨论】:

    • 我理解您的回答,也许我的问题以错误的方式提出。但是我的想法是,如果我有一个变量(让我们看看 B 的示例)有 1 列和 30000 行的值从 1983 年到 2012 年,为什么我会得到 2012 年的假人而不是 30 个假人,这是不同值的数量我们在 B 中观察?
    • @user3557054 你不明白答案,否则你也不会糊涂。 dummyvar 函数假定您有从 1max(B) 标记的变量 - 但没有观察到变量 11982 (结果的前 1982 列将全部设置为零)。
    • @user3557054 查看编辑后的答案。也许第二部分是你想要的
    • @ChrisTaylor 我明白答案,但它不能解决我的问题。如果我只能有 30 个假人,那么有这么多假人有什么意义。我必须手动删除它们?像这样,我的回归会出错,因为我有太多的假人。所以我只是认为有一种方法可以让 Matlab 识别“无用”的假人。
    • @user3557054 这就是我更新的答案所做的。你检查了吗?
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 2015-04-08
      • 2021-01-13
      相关资源
      最近更新 更多