我有一个数据框架,我想用它来生成一个设计矩阵。
>ct<-read.delim(filename, skip=0, as.is=TRUE, sep="\t", row.names = 1)
> ct
s2 s6 S10 S14 S3 S7 S11 S15 S4 S8 S12 S16
group 1 1 1 1 2 2 2 2 3 3 3 3
donor 1 2 3 4 1 2 3 4 1 2 3 4
>factotum<-apply(ct,1,as.factor) # to turn rows into factors.
>design <- model.matrix(~0 + factotum[,1] + factotum[,2])最后,我将生成一个字符串并使用as.formula(),而不是硬编码公式。无论如何,这是可行的,并产生一个设计矩阵。不过,它省略了一列。
>design
factotum[, 1]1 factotum[, 1]2 factotum[, 1]3 factotum[, 2]2 factotum[, 2]3 factotum[, 2]4
1 1 0 0 0 0 0
2 1 0 0 1 0 0
3 1 0 0 0 1 0
4 1 0 0 0 0 1
5 0 1 0 0 0 0
6 0 1 0 1 0 0
7 0 1 0 0 1 0
8 0 1 0 0 0 1
9 0 0 1 0 0 0
10 0 0 1 1 0 0
11 0 0 1 0 1 0
12 0 0 1 0 0 1根据我的推理,列名应该是: factotum,11 factotum,12 factotum,13,factotum,21,factotum,22 factotum,23 factotum,24。这些将重命名为group1、group2、group3、donor1、donor2、donor3、donor4。
这意味着21岁的事实,或donor1,丢失了。我在做什么,这会丢失吗?任何帮助都将不胜感激。
干杯本。
发布于 2016-02-27 06:30:05
这里有几件事。
(1) apply(ct,1,as.factor)不一定将行转换为因子。尝试str(factotum),您将看到它失败了。我不确定最快的方法是什么,但这应该是可行的:
factotum <- data.frame(lapply(data.frame(t(ct)), as.factor))(2)由于您使用的是因子,因此model.matrix会创建虚拟编码。在本例中,donor有四个值。如果您是2,那么您将在factotum[,2]2列中获得一个1。如果您是3或4,您将在它们各自的列中获得一个1。如果你是1,那又如何呢?好吧,这仅仅意味着您在所有三列中都是0。这样,您只需要三列即可创建四个组。donor的值1在这里称为参考组,它是与其他组进行比较的组。
(3)所以现在的问题是……为什么group (或factotum[,1])不能只有两列?我们可以很容易地编写三个级别的两列代码,对吗?好吧..。是的,这正是您使用以下命令时发生的情况:
design <- model.matrix(~ factotum[,1] + factotum[,2])但是,由于您指定没有截取,因此您将获得一个额外的group列。
(4)通常你不必自己创建设计矩阵。我不确定您下一步要使用哪个函数,但在大多数情况下,函数会为您处理它。
https://stackoverflow.com/questions/35642668
复制相似问题