首页 > 解决方案 > 是否可以使用 outer() 生成笛卡尔积?

问题描述

要在 R 中获得笛卡尔积,我们可以使用

library(tidyr)
x <- 1:2
y <- 1:3
expand_grid(x, y)

输出:

# A tibble: 6 x 2
      x     y
  <int> <int>
1     1     1
2     1     2
3     1     3
4     2     1
5     2     2
6     2     3

但我想输出类似矩阵,如下所示:

outer(x, y, FUN = "+")

这给出了输出:

     [,1] [,2] [,3]
[1,]    2    3    4
[2,]    3    4    5

是否有一个FUN = 可以outer()产生笛卡尔积的方法:

           [,1]       [,2]       [,3]
[1,]    c(1, 1)    c(1, 2)    c(1, 3)
[2,]    c(2, 1)    c(2, 2)    c(2, 3)

标签: router-joincartesian-product

解决方案


FUN中没有expand_grid。一个选项是用来mutate创建一个新列,然后用pivot_wider

library(dplyr)
library(tidyr)
expand_grid(x, y) %>% 
     mutate(out = x + y) %>% 
     pivot_wider(names_from = y, values_from = out) %>%
     select(-x) %>%
     as.matrix %>% 
     `dimnames<-`(., NULL)

-输出

      [,1] [,2] [,3]
[1,]    2    3    4
[2,]    3    4    5

关于第二个问题,似乎 OP 想要将每个元素存储matrixlist

out1 <- outer(x, y, FUN = Vectorize(function(x, y) list(c(x, y))))

-输出

out1
     [,1]      [,2]      [,3]     
[1,] integer,2 integer,2 integer,2
[2,] integer,2 integer,2 integer,2

推荐阅读