George Dontas - 1 year ago 78

R Question

Is there a way - other than a for loop - to generate new variables in an R dataframe, which will be all the possible 2-way interactions between the existing ones?

i.e. supposing a dataframe with three numeric variables V1, V2, V3, I would like to generate the following new variables:

`Inter.V1V2 (= V1 * V2)`

Inter.V1V3 (= V1 * V3)

Inter.V2V3 (= V2 * V3)

Example using for loop :

`x <- read.table(textConnection('`

V1 V2 V3 V4

1 9 25 18

2 5 20 10

3 4 30 12

4 4 34 16'

), header=TRUE)

dim.init <- dim(x)[2]

for (i in 1: (dim.init - 1) ) {

for (j in (i + 1) : (dim.init) ) {

x[dim(x)[2] + 1] <- x[i] * x[j]

names(x)[dim(x)[2]] <- paste("Inter.V",i,"V",j,sep="")

}

}

Answer Source

Here is a one liner for you that also works if you have factors:

```
> model.matrix(~(V1+V2+V3+V4)^2,x)
(Intercept) V1 V2 V3 V4 V1:V2 V1:V3 V1:V4 V2:V3 V2:V4 V3:V4
1 1 1 9 25 18 9 25 18 225 162 450
2 1 2 5 20 10 10 40 20 100 50 200
3 1 3 4 30 12 12 90 36 120 48 360
4 1 4 4 34 16 16 136 64 136 64 544
attr(,"assign")
[1] 0 1 2 3 4 5 6 7 8 9 10
```