是否可以使用 outer() 生成笛卡尔积?
Is it possible to use outer() to generate a Cartesian product?
要在 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
outer()
是否有 FUN =
会产生笛卡尔积:
[,1] [,2] [,3]
[1,] c(1, 1) c(1, 2) c(1, 3)
[2,] c(2, 1) c(2, 2) c(2, 3)
expand_grid
中没有FUN
。一种选择是使用 mutate
创建一个新列,然后使用 pivot_wider
重塑回 'wide'
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 integer,2
[2,] integer,2 integer,2 integer,2
要在 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
outer()
是否有 FUN =
会产生笛卡尔积:
[,1] [,2] [,3]
[1,] c(1, 1) c(1, 2) c(1, 3)
[2,] c(2, 1) c(2, 2) c(2, 3)
expand_grid
中没有FUN
。一种选择是使用 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 integer,2
[2,] integer,2 integer,2 integer,2