是否有一个本地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函数,它将采用输入向量并返回相应的二进制矩阵,其中矩阵与输入向量中的唯一值具有相同的列数?将矢量转换为逻辑矩阵
例如,给定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
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"
更加清晰+1 – 2012-08-15 14:15:03
其实,contrasts
是你想要的。
contrasts(as.factor(1:3), contrasts=FALSE)
1 2 3
1 1 0 0
2 0 1 0
3 0 0 1
BAH - 我完全无法阅读文档......谢谢先生。 – Chase 2012-08-15 14:19:35
@Chase如果**那** *是*你想要什么,'diag(3)'有什么错?请注意,对于我的答案中更复杂的'fac','contrasts(fac,contrasts = FALSE)'与'model.matrix()'的结果并不相同。也许我误解了你想要的,但是如果我这样做了,'diag()'就足够了吗? – 2012-08-15 14:22:10
@Gavin辛普森 - 好直觉,今天早上我到处都是。你的第二个例子更能代表我的真实用例。必须喝咖啡和/或睡觉。再次感谢。 – Chase 2012-08-15 15:11:45
你能否澄清一下这个因素是否只包含来自每个等级的单一观察值?或者每个级别可以有多个观测值? – 2012-08-15 14:23:01