2

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 つの列を使用して 3 つの新しい行列を取得したいということです。
これらの行列は、次の列で構成されています。 12, 13, 14, 23, 24, 34, 123, 124, 134, 234, 1234. ここでは、12 を使用して を表しcolumn 1 * column 2ます。

最初の行列には 6 つの列があります。 12, 13, 14, 23, 24, 34

    X1 X2 X3 X4 X5 X6 
1    1  1  1  1  1  1  
2    1  1  1  1  1  1  
3   -1 -1 -1  1  1  1  
4   -1 -1 -1  1  1  1  
5    2  2 -2  1 -1 -1 
6    2  2 -2  1 -1 -1  
7   -2 -2  2  1 -1 -1  
8   -2 -2  2  1 -1 -1  
9    3 -3  3 -1  1 -1 
10   3 -3  3 -1  1 -1 
11  -3  3 -3 -1  1 -1 
12  -3  3 -3 -1  1 -1 
13   4 -4 -4 -1 -1  1 
14   4 -4 -4 -1 -1  1 
15  -4  4  4 -1 -1  1 
16  -4  4  4 -1 -1  1 

2 番目の行列には 4123, 124, 134, 234
つの列があり、最後の行列には 1 つの列があります。1234

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

4

3 に答える 3

3

このタスクを達成するための小さな関数を作成できます (OP が彼の投稿で使用したのと同じタイプの表記法を想定しています)

create_prodmat <- function(mat, cols) {

index <- lapply(strsplit(cols, ""), as.numeric)

res <- do.call("cbind",
               lapply(index, function(i) apply(mat[, i, drop = FALSE], 1, prod))
               )
colnames(res) <- cols
res

}



mat <- matrix(rep(c(1, 2, 3), each = 4), ncol = 3)
mat

##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    1    2    3
## [3,]    1    2    3
## [4,]    1    2    3


cols1 <- c("12", "13", "23")
cols2 <- "13"

create_prodmat(mat, cols1)

##      12 13 23
## [1,]  2  3  6
## [2,]  2  3  6
## [3,]  2  3  6
## [4,]  2  3  6


create_prodmat(mat, cols2)

##        13
## [1,]    3
## [2,]    3
## [3,]    3
## [4,]    3
于 2013-05-01T06:29:04.957 に答える
2

データ フレームの名前がdat. あなたの問題を正しく理解していれば、次のことができます

A1 <- as.matrix(dat[,c(1,2,2,3)] * dat[,c(4,3,4,4)])
A2 <- as.matrix(dat[,c(1,1,1,2)] * dat[,c(2,2,3,3)] * dat[,c(3,4,4,4)])
A3 <- as.matrix(dat[,1] * dat[,2] * dat[,3] * dat[,4])
于 2013-05-01T06:08:54.203 に答える
1

以下はそれを行う必要があります。
行ごとに分けたので、簡単にたどることができます。説明が必要な場合はお知らせください。

newColumns <- "14, 23, 24, 34, 123, 124, 134, 234, 1234"

splat1 <- strsplit(newColumns, ", ")[[1]]

splat <- strsplit(splat1, "")

splat <- lapply(splat, as.numeric)

results <- sapply(splat, function(cols) apply(master.matrix[, cols, drop=FALSE], 1, prod))

first <- results[, 1:4]
second <- results[, 5:8]
third <- results[, 9, drop=FALSE]

first; second; third

         [,1] [,2] [,3] [,4]
  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
     [,1] [,2] [,3] [,4]
  1     1    1    1    1
  2     1    1    1    1
  3     1    1    1   -1
  4     1    1    1   -1
  5     2   -2   -2   -1
  6     2   -2   -2   -1
  7     2   -2   -2    1
  8     2   -2   -2    1
  9    -3    3   -3   -1
  10   -3    3   -3   -1
  11   -3    3   -3    1
  12   -3    3   -3    1
  13   -4   -4    4    1
  14   -4   -4    4    1
  15   -4   -4    4   -1
  16   -4   -4    4   -1
     [,1]
  1     1
  2     1
  3    -1
  4    -1
  5    -2
  6    -2
  7     2
  8     2
  9    -3
  10   -3
  11    3
  12    3
  13    4
  14    4
  15   -4
  16   -4
于 2013-05-01T06:07:05.383 に答える