您可以使用两种方法:一种采用公式参数,或者如果您不使用公式,您可以使用model.matrix
.
您可以执行以下操作:
# Using the same data from the question:
data <- data.table(A = c(0, 2, 4),
B = c(1, 3, 5))
> data
A B
1: 0 1
2: 2 3
3: 4 5
如果只需要原始数据和交互
formula = y ~ .^2
model.matrix(formula, data=data)
(Intercept) A B A:B
1 1 0 1 0
2 1 2 3 6
3 1 4 5 20
如果需要原始数据、平方列、交互和截距,就像问题一样
您可以对所有变量使用以下公式:
formula = y ~ .^2 + poly(var, 2, raw=TRUE)[, 2] ... etc
此外,您可以自动粘贴变量名称。基于这篇文章的公式
formula <- as.formula(paste(' ~ .^2 + ',paste('poly(',colnames(data),',2, raw=TRUE)[, 2]',collapse = ' + ')))
> formula
~.^2 + poly(A, 2, raw = TRUE)[, 2] + poly(B, 2, raw = TRUE)[, 2]
> model.matrix(formula, data=data)
(Intercept) A B poly(A, 2, raw = TRUE)[, 2] poly(B, 2, raw = TRUE)[, 2] A:B
1 1 0 1 0 1 0
2 1 2 3 4 9 6
3 1 4 5 16 25 20
生成的数据框与问题中的数组相同。
如果是平方列,则需要交互和截距。
> formula <- as.formula(paste(' ~ A:B + ',paste('poly(',colnames(data),',2, raw=TRUE)[, 2]',collapse = ' + ')))
> formula
~A:B + poly(A, 2, raw = TRUE)[, 2] + poly(B, 2, raw = TRUE)[, 2]
> model.matrix(formula, data=data)
(Intercept) poly(A, 2, raw = TRUE)[, 2] poly(B, 2, raw = TRUE)[, 2] A:B
1 1 0 1 0
2 1 4 9 6
3 1 16 25 20