Это хорошо работает.outer
принимает все комбинации, и вы можете указать их суммирование.
outer(a,b,"+")
#> [,1] [,2] [,3]
#> [1,] 3 4 5
#> [2,] 4 5 6
#> [3,] 5 6 7
expand.grid
будет медленнее, но создаст двухблочный data.frame, с которым вы сможете работать.Обратите внимание, что с expand.grid
вы можете передать любое количество векторов, но результат будет быстро расти.Таким образом, это не сработает, если у вас есть миллион вещей, которые можно пересечь с миллионом вещей (в результате получается триллион вещей).Также стоит отметить, что это базовая функция, но вы также можете попробовать tidyr::crossing(a,b)
или data.table::CJ
, что может быть быстрее (хотя и не в этом примере с игрушкой).
df = expand.grid(a=a,b=b)
head(df)
#> a b
#> 1 1 2
#> 2 2 2
#> 3 3 2
#> 4 1 3
#> 5 2 3
#> 6 3 3
Из этого вы можете легко извлечьсуммы.
r = df$a+df$b
r
#> [1] 3 4 5 4 5 6 5 6 7