是否可以使用 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]       [,]    c(1,1)    c(1,2)    c(1,3)
[2,]    c(2,1)    c(2,2)    c(2,3)

解决方法

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 似乎想将 matrix 的每个元素存储为 list

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

-输出

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...