使用原始列获取新矩阵

时间:2013-04-24 00:57:40

标签: r

我有一个由4列组成的矩阵(即第1列,第2列,第3列和第4列)

  V1 V2 V3 V4
1  1  1  1  1
2  1  1  1  1
3  1 -1 -1 -1
4  1 -1 -1 -1
5  2  1  1 -1
6  2  1  1 -1
7  2 -1 -1  1
8  2 -1 -1  1
9  3  1 -1  1
10 3  1 -1  1
11 3 -1  1 -1
12 3 -1  1 -1
13 4  1 -1 -1
14 4  1 -1 -1
15 4 -1  1  1
16 4 -1  1  1

我的问题是: 我想使用这4列来获得一个有15列的新矩阵。 这15列是:

1, 2, 3, 4, 12, 13, 14, 23, 24, 34, 123, 124, 134, 234, 1234.

这里我用12代表column 1 * column 2

所以1234 = column 1 * column 2 * column 3 * column 4

有没有人有一些简单的代码来执行此操作?感谢大家的帮助。

2 个答案:

答案 0 :(得分:3)

使用您拥有的三列,您可以执行此操作:

 model.matrix(~ V1*V2*V3, data=x)

或者这个:

 model.matrix(~ 0 + V1*V2*V3, data=x)

(编辑:最初有三列。解决方案以明显的方式扩展到4列)

这个想法很容易扩展到更多列。

但如果你为了适应模特而试图这样做,你就是在浪费时间 - 没有必要直接计算它们。

答案 1 :(得分:1)

尽管@ Glen_b的回答几乎肯定是可取的,但这是另一次尝试:

# make some sample data
dat <- data.frame(V1=1:3,V2=2:4,V3=3:5,V4=5:7)

# get all the possible combinations
comps <- Reduce(c,sapply(2:4,function(x) combn(1:4,x,simplify=FALSE)))
#str(comps)
#List of 11
# $ : int [1:2] 1 2
# $ : int [1:2] 1 3
# $ : int [1:2] 1 4
# $ : int [1:2] 2 3
# $ : int [1:2] 2 4
# $ : int [1:2] 3 4
# $ : int [1:3] 1 2 3
# $ : int [1:3] 1 2 4
# $ : int [1:3] 1 3 4
# $ : int [1:3] 2 3 4
# $ : int [1:4] 1 2 3 4

# multiply out the combinations    
data.frame(dat,sapply(comps,function(x) Reduce("*",dat[x]) ))

#  V1 V2 V3 V4 X1 X2 X3 X4 X5 X6 X7 X8  X9 X10 X11
#1  1  2  3  5  2  3  5  6 10 15  6 10  15  30  30
#2  2  3  4  6  6  8 12 12 18 24 24 36  48  72 144
#3  3  4  5  7 12 15 21 20 28 35 60 84 105 140 420

正如@mnel在评论中指出的那样,您还可以将一个函数传递给combn,该函数将应用于每个组合,这样就可以一步到位:

do.call(
        cbind,
          sapply(
          seq_along(dat),
          function(m) combn(m=m, x = dat, FUN = function(xx) Reduce('*',xx ))
                )
       )