我有一个由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
。
有没有人有一些简单的代码来执行此操作?感谢大家的帮助。
答案 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 ))
)
)