Génération des variables d'interaction dans des trames de données R
Question
Y at-il un moyen - autre qu'une boucle - pour générer de nouvelles variables dans un R dataframe, qui sera toutes les interactions 2 voies possibles entre ceux qui existent déjà? à-dire en supposant une trame de données avec trois variables numériques V1, V2, V3, je voudrais générer les nouvelles variables suivantes:
Inter.V1V2 (= V1 * V2)
Inter.V1V3 (= V1 * V3)
Inter.V2V3 (= V2 * V3)
Exemple d'utilisation pour la boucle:
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="")
}
}
La solution
Voici une doublure pour vous qui fonctionne aussi si vous avez des facteurs:
> 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
Autres conseils
Ici, vous allez, en utilisant combn
et apply
:
> x2 <- t(apply(x, 1, combn, 2, prod))
Réglage des noms de colonnes peut être fait avec deux commandes paste
:
> colnames(x2) <- paste("Inter.V", combn(1:4, 2, paste, collapse="V"), sep="")
Enfin, si vous voulez que toutes vos variables ensemble, il suffit de les cbind
:
> x <- cbind(x, x2)
> V1 V2 V3 V4 Inter.V1V2 Inter.V1V3 Inter.V1V4 Inter.V2V3 Inter.V2V4 Inter.V3V4
1 1 9 25 18 9 25 18 225 162 450
2 2 5 20 10 10 40 20 100 50 200
3 3 4 30 12 12 90 36 120 48 360
4 4 4 34 16 16 136 64 136 64 544
Je pense que cette question devrait être complétée par la fonction poly/polym
, qui va futher: il génère des interactions non seulement entre les variables, mais sa puissance jusqu'à ce que le degré sélectionné. Et orthogonale iteractions , qui peut être très utile.
La solution directement au problème posé serait:
> polym(x$V1, x$V2, x$V3, x$V4, degree = 2, raw = T)
1.0.0.0 2.0.0.0 0.1.0.0 1.1.0.0 0.2.0.0 0.0.1.0 1.0.1.0 0.1.1.0 0.0.2.0 0.0.0.1 1.0.0.1 0.1.0.1 0.0.1.1 0.0.0.2
[1,] 1 1 9 9 81 25 25 225 625 18 18 162 450 324
[2,] 2 4 5 10 25 20 40 100 400 10 20 50 200 100
[3,] 3 9 4 12 16 30 90 120 900 12 36 48 360 144
[4,] 4 16 4 16 16 34 136 136 1156 16 64 64 544 256
attr(,"degree")
[1] 1 2 1 2 2 1 2 2 2 1 2 2 2 2
Les colonnes 4, 7, 8, 11, 12, 13 a l'demandé dans la question. D'autres colonnes ont d'autres types d'interactions. Si vous souhaitez obtenir des interactions orthogonales, vient de mettre raw = FALSE
.