Depending on what your ultimate goal is, you could use something like

want <- model.matrix(  ~ (a + b + c + d)^2 , data=your_data)

This will create a matrix with the appropriate main effects and first order interactions.  If you just want to run a simple regression, you could do it directly

lm(y ~ (a + b + c + d)^2 , data=your_data)

but the formula (a + b + c + d)^2 isn't accepted by all packages that do some form of regression.


Hope this is helpful,

Dan


On 3/23/2025 10:47 AM, Stephen Bond via R-help wrote:
I am sending to this forum as stackoverflow has devolved into sth
pretty bad.
Below code shows how to get what I want in a clumsy way.

cols <- letters[1:4]
a1 <- outer(cols,cols,paste0)
b1 <- a1[!lower.tri(a1)]

X <- matrix(rnorm(80),ncol=4)
colnames(X) <- cols
X <- as.data.frame(X)
XX <- matrix(0,nrow=nrow(X),ncol=length(b1))
colnames(XX) <- b1

for (k in 1:length(b1)){
     XX[,k] <- X[,substr(b1[k],1,1)]*X[,substr(b1[k],2,2)]
}



Is there a way to get that using a formula or some neat trick? The
above will not work for factors, so I will need to create the factor
crossings using formula a*b*c and then cross with the numerics, which
is even more clumsy.
Thanks everybody

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

--
Daniel Nordlund
Port Townsend, WA
(425) 273-5256

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to