创建矩阵列的元素乘积

时间:2017-04-27 07:29:06

标签: r matrix vector multiplication

x1  x2  x3  x11 x12 x13 x22 x23 x33
1   5   9   1   5   9   25  45  81
2   6   10  4   12  20  36  60  100
3   7   11  9   21  33  49  77  121
4   8   12  16  32  48  64  96  144

当给出x1x2x3时,我想创建一个矩阵或数据框x11, x12, x13, x22, x23,以及x33这些元素向量x1, x2x3的逐步乘积。

实际上我想更多的向量(例如x1 ~ x6)到高阶(第3或第4)。 是否有R命令可以执行此操作?

2 个答案:

答案 0 :(得分:2)

我们可以与expand.grid组合查找列1:3的所有组合,然后循环遍历行,对数据集进行子集化并获取*

nm1 <- names(df1)[1:3]
apply(expand.grid(nm1, nm1), 1, FUN = function(x) Reduce(`*`, df1[x]))

以上输出给出了所有组合,但假设我们要删除镜像组合

#expand the names to two columns with each combination
d1 <- expand.grid(nm1, nm1)
#remove the rows that are duplicates
d2 <- d1[!duplicated(t(apply(d1, 1, sort))),]
#apply the function and change the column names
d3 <- apply(d2, 1, FUN = function(x) Reduce(`*`, df1[x]))
colnames(d3) <- do.call(paste0, d2)

如果需要,cbind包含前3列

cbind(df1[1:3], d3)

另一个选项是combn

d1 <- as.data.frame(combn(nm1, 2, FUN = function(x) Reduce(`*`, df1[x])))
nm2 <- combn(nm1, 2, FUN = paste, collapse="")
names(d1) <- nm2
d2 <- setNames(as.data.frame(df1[1:3]^2), paste0(nm1, nm1))
cbind(df1[1:3], d1, d2)

答案 1 :(得分:0)

你也可以在基础R中完成矢量化:

# Data
m <- matrix(1:12,4,3)

cl <- ncol(m)
res <- cbind(m, m[,rep(seq(cl), cl:1)] * m[,unlist(Map(":", 1:cl, rep(cl,cl)))])

      # [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
# [1,]    1    5    9    1    5    9   25   45   81
# [2,]    2    6   10    4   12   20   36   60  100
# [3,]    3    7   11    9   21   33   49   77  121
# [4,]    4    8   12   16   32   48   64   96  144

基本上,您首先选择要为其提供产品的列,然后一次性完成。