質問
forループ以外 - - Rのデータフレームに新たな変数を生成するために、既存のものとの間のすべての可能な2ウェイの相互作用になります。
方法はありますか? すなわち、仮にAデータフレーム3の数値変数V1、V2、V3と、私は次の新しい変数を生成したいと思います:
Inter.V1V2 (= V1 * V2)
Inter.V1V3 (= V1 * V3)
Inter.V2V3 (= V2 * V3)
forループを使用して、例
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="")
}
}
解決
ここでは、要因を持っている場合にも動作しますあなたのための1つのライナーがあります:
> 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
他のヒント
ここでは、combn
とapply
を使用して、行くます:
> x2 <- t(apply(x, 1, combn, 2, prod))
列名を設定するには、2つのpaste
コマンドで行うことができます:
> colnames(x2) <- paste("Inter.V", combn(1:4, 2, paste, collapse="V"), sep="")
最後に、あなたは、一緒にすべての変数をしたい場合は、単にそれらを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
私はこの質問はfuther行くpoly/polym
機能、で補完されるべきだと思う。それは選択された程度までだけではなく、変数間の相互作用が、その電力を発生します。そして、直交iteractions に、非常に便利でありうるます。
尋ねた問題に直接解決策は以下のようになります:
> 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
列4、7、8、11、12、13は、当該要求しました。他の列は、相互作用の他の種類を持っています。あなたは、直交相互作用を取得したい場合は、単にraw = FALSE
を設定します。
所属していません StackOverflow