【问题标题】:Convert a vector into logical matrix将向量转换为逻辑矩阵
【发布时间】:2012-08-15 13:57:32
【问题描述】:

是否有一个原生 R 函数将接受输入向量并返回相应的二进制矩阵,其中矩阵的列数与输入向量中的唯一值相同?

例如,给定x <- 1:3,我想返回以下矩阵:

     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

函数contrasts 接近了,但我似乎无法绕过返回的 n-1 列:

> contrasts(as.factor(x))
  2 3
1 0 0
2 1 0
3 0 1

【问题讨论】:

  • 您能否澄清该因子是否只包含每个级别的单个观察值?或者每个级别可以有多个观察?

标签: r


【解决方案1】:

model.matrix() 在这里可能会有所帮助,但您需要抑制拦截:

> model.matrix(~ factor(1:3) - 1)
  factor(1:3)1 factor(1:3)2 factor(1:3)3
1            1            0            0
2            0            1            0
3            0            0            1
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$`factor(1:3)`
[1] "contr.treatment"

稍微复杂一点:

> set.seed(1)
> fac <- factor(sample(1:3, 10, replace = TRUE))
> model.matrix(~ fac - 1)
   fac1 fac2 fac3
1     1    0    0
2     0    1    0
3     0    1    0
4     0    0    1
5     1    0    0
6     0    0    1
7     0    0    1
8     0    1    0
9     0    1    0
10    1    0    0
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$fac
[1] "contr.treatment"

【讨论】:

    【解决方案2】:

    其实contrasts就是你想要的。

    contrasts(as.factor(1:3), contrasts=FALSE)
    
      1 2 3
    1 1 0 0
    2 0 1 0
    3 0 0 1
    

    【讨论】:

    • 呸 - 我在阅读文档时完全失败了......谢谢先生。
    • @Chase 如果那个 你想要的,diag(3)有什么问题???请注意,对于我的回答中更复杂的faccontrasts(fac, contrasts = FALSE) 给出的结果与model.matrix() 不同。也许我误解了你想要的,但如果我这样做了,diag() 就足够了?
    • @GavinSimpson - 直觉很好,今天早上我到处都是。你的第二个例子更能代表我的真实用例。必须喝咖啡和/或睡觉。再次感谢。
    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多