0

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

これを行うための簡単なコードを持っている人はいますか? みんなの助けに感謝します。

4

2 に答える 2

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各組み合わせに適用される関数を に渡すこともできるため、これは 1 つのステップで処理されます。

do.call(
        cbind,
          sapply(
          seq_along(dat),
          function(m) combn(m=m, x = dat, FUN = function(xx) Reduce('*',xx ))
                )
       )
于 2013-04-24T01:34:14.033 に答える