问题描述
要在 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