【问题标题】:Generating interaction variables in R dataframes在 R 数据框中生成交互变量
【发布时间】:2011-01-06 01:12:35
【问题描述】:

除了 for 循环之外,还有其他方法可以在 R 数据帧中生成新变量,这将是现有变量之间所有可能的双向交互吗? 即假设一个具有三个数值变量 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="")

        }
}

【问题讨论】:

    标签: r dataframe


    【解决方案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
    

    【讨论】:

    • 太棒了!您还可以摆脱不相关的(在我们的例子中)拦截 model.matrix(~(V1+V2+V3+V4)^2-1,x)
    • 没错。或者对于完全一般的情况 as.data.frame(model.matrix(~ .^2-1,x))
    • 如果你有数值变量而不是因子怎么办?这种方法还能用吗?
    • 这也适用于数值变量。请注意,它不提供像 V1*V1 这样的自我交互术语。
    【解决方案2】:

    在这里,使用combnapply

    > x2 <- t(apply(x, 1, combn, 2, prod))
    

    可以通过两个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
    

    【讨论】:

    • 非常好!根据示例,有没有办法使用 apply 来更改列名?
    • 如果您只是要在采用公式的模型(例如 lm 或 glm)中使用这些交互,则无需生成变量。见:cran.r-project.org/doc/manuals/…
    • @Tristan :好的,我知道在使用模型时,可以使用 R 的建模公式来完成。我想做的是生成交互变量,将它们用作分类问题的预测器。
    • 太棒了 - 如果在编写代码时数据的列名是未知的,这正是可以使用的!
    【解决方案3】:

    我认为这个问题应该用poly/polym 函数来补充,它更进一步:它不仅产生变量之间的交互作用,而且产生直到选定程度的力量。还有orthogonal 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2020-05-10
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 2018-08-12
      相关资源
      最近更新 更多