是否有一种方法 - 除了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)
Sha*_*ane 15
你去,使用combn和apply:
> 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)
| 归档时间: |
|
| 查看次数: |
20388 次 |
| 最近记录: |