这是我当前问题的简化版本。我需要从2个模型矩阵创建一个model.matrix,而不丢失“赋值”中的信息。例如,考虑数据和公式
y<-rnorm(100); x1<-rnorm(100); x2<-rnorm(100); x3<-rnorm(100)
f1 <- y ~ x1 + x2 + x3
和使用
创建的2个模型矩阵X1
和X2
trms<-terms.formula(f1)
trms2<-drop.terms(trms, dropx = 2)
trms3<-drop.terms(trms, dropx = -2)
X1<-model.matrix(trms2)
X2<-model.matrix(trms3)
是否有一种简便的方法可以从X1
和X2
创建具有1个拦截列并且具有X
的矩阵attr(,"assign")
,而该矩阵可以从{{1}获得}?
答案 0 :(得分:0)
如果我正确理解了这个问题,那么简单直接的东西怎么样:
X3 <- cbind(X1[,1:2], X2[,2], X1[,3])
attr(X3,"assign") <- c(0,1,2,3)
colnames(X3) <- c("Intercept",attr(trms, "term.labels"))
head(X3)
Intercept x1 x2 x3 1 1 -1.28372461 -0.2598796 0.3028496 2 1 0.56880875 0.2803302 0.7593734 3 1 -0.32480770 -1.6705911 -1.1750247 4 1 -1.02761734 -0.1405454 -0.6805033 5 1 0.84218452 -0.1224962 -1.3882420 6 1 0.07221231 0.5587801 -0.9042751
答案 1 :(得分:0)
我不确定这是否是您要尝试的方法,但是cbind()
在这种情况下似乎可以正常工作。
X <- cbind(X1, X2)
X <- X[, !duplicated(colnames(X))]
然后可以从X1和X2连接属性。为了避免重复,您只能从X2获取尚未在X1中存在的分配信息:
attributes(X)$assign <- c(attr(X1,"assign"), attr(X2,"assign")[!attr(X2,"assign") %in% attr(X1,"assign")])
如果这不是您要让我们知道的。