Как скрестить добавить несколько векторов с неравным п с каждого элемента в другом - PullRequest
0 голосов
/ 22 октября 2018

Если у меня есть

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

Правильный ответ должен бытьрасширение.grid (C, B, A)

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вот вариант с CJ

library(data.table)
CJ(A, B, C)[, Reduce(`+`, .SD)]
#[1] 19 20 22 20 21 23 25 26 28 26 27 29
0 голосов
/ 22 октября 2018

Мы могли бы использовать expand.grid с rowSums

rowSums(expand.grid(A, B, C))

#[1] 19 25 20 26 20 26 21 27 22 28 23 29

Некоторое объяснение - expand.grid возвращает строку для каждой комбинации A, B и 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

EDIT

Если важен порядок выводамы можем 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 

или если у вас много столбцов и вы не хотите вызывать каждый столбец по имени, которое вы можете сделать

rowSums(mat[do.call(order,mat), ])
#19 20 22 20 21 23 25 26 28 26 27 29 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...