如何交叉添加n个不相等的向量与另一个元素中的每个元素

时间:2018-10-22 03:05:54

标签: r

如果我有

A<-c(1,7)
B<-c(8,9)
C<-c(10,11,13)

我希望拥有

 Sum<-c(1+8+10, 1+8+11, 1+8+13, 1+9+10, 1+9+11, 1+9+13, 7+8+10, 7+8+11, 7+8+13, 
        7+9+10, 7+9+11, 7+9+13)

在R中有简单的方法吗?

*********更新************

很抱歉,我之前并不清楚,我真的想寻求一个通用的解决方案,

A<-c(a1,a2)
B<-c(b1,b2)
C<-c(c1,c2,c3)

我真正希望的是

 Sum<-c(a1+b1+c1, a1+b1+c2, a1+b1+c3, a1+b2+c1, a1+b2+c2, a1+b2+c3,a2+b1+c1, a2+b1+c2, a2+b1+c3, a2+b2+c1, a2+b2+c2, a2+b2+c3)

并保持此顺序,而不考虑ABC的值。

更新2

正确答案应该为expand.grid(C,B,A)

2 个答案:

答案 0 :(得分:6)

我们可以将transactionHashexpand.grid一起使用

rowSums

一些解释-rowSums(expand.grid(A, B, C)) #[1] 19 25 20 26 20 26 21 27 22 28 23 29 expand.gridAB的每种组合返回一行

C

,然后每行取expand.grid(A, B, C) # Var1 Var2 Var3 #1 1 8 10 #2 7 8 10 #3 1 9 10 #4 7 9 10 #5 1 8 11 #6 7 8 11 #7 1 9 11 #8 7 9 11 #9 1 8 13 #10 7 8 13 #11 1 9 13 #12 7 9 13


我们还可以使用双sum

outer

编辑

如果输出的顺序很重要,我们可以在使用c(outer(outer(A, B, "+"), C, "+")) #[1] 19 25 20 26 20 26 21 27 22 28 23 29 之后order

expand.grid

或者如果您有很多列并且不想按名称调用每一列,您可以这样做

mat <- expand.grid(A, B, C)
rowSums(mat[order(mat$Var1, mat$Var2, mat$Var3), ])
#19 20 22 20 21 23 25 26 28 26 27 29 

答案 1 :(得分:3)

这里是CJ

的一个选项
library(data.table)
CJ(A, B, C)[, Reduce(`+`, .SD)]
#[1] 19 20 22 20 21 23 25 26 28 26 27 29