我有一个由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
第二个矩阵有4列:123, 124, 134, 234
最后一个矩阵有一列:1234
有没有人有一些简单的代码来执行此操作?感谢大家的帮助。
答案 0 :(得分: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
答案 1 :(得分: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])
答案 2 :(得分: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