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
当给出x1
,x2
和x3
时,我想创建一个矩阵或数据框x11, x12, x13, x22, x23
,以及x33
这些元素向量x1, x2
和x3
的逐步乘积。
实际上我想更多的向量(例如x1 ~ x6
)到高阶(第3或第4)。
是否有R命令可以执行此操作?
答案 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
基本上,您首先选择要为其提供产品的列,然后一次性完成。