在R数据帧中生成交互变量

Geo*_*tas 22 r dataframe

是否有一种方法 - 除了for循环 - 在R数据帧中生成新变量,这将是现有的所有可能的双向交互?即假设一个具有三个数值变量V1,V2,V3的数据帧,我想生成以下新变量:

Inter.V1V2 (= V1 * V2) 
Inter.V1V3 (= V1 * V3)
Inter.V2V3 (= V2 * V3)
Run Code Online (Sandbox Code Playgroud)

使用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="")

        }
}
Run Code Online (Sandbox Code Playgroud)

Ian*_*ows 35

这里有一个适合你的衬垫,如果你有因素也适用:

> 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
Run Code Online (Sandbox Code Playgroud)

  • 优秀!你也可以摆脱不相关的(在我们的例子中)拦截model.matrix(〜(V1 + V2 + V3 + V4)^ 2-1,x) (2认同)
  • 你是对的.或完全一般情况as.data.frame(model.matrix(〜.^ 2-1,x)) (2认同)

Sha*_*ane 15

你去,使用combnapply:

> x2 <- t(apply(x, 1, combn, 2, prod))
Run Code Online (Sandbox Code Playgroud)

可以使用两个paste命令设置列名:

> colnames(x2) <- paste("Inter.V", combn(1:4, 2, paste, collapse="V"), sep="")
Run Code Online (Sandbox Code Playgroud)

最后,如果你想把所有变量放在一起,只需要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
Run Code Online (Sandbox Code Playgroud)