r - 是否可以使用 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)
解决方案
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 integer,2
[2,] integer,2 integer,2 integer,2
推荐阅读
- vb.net - “这一行已经属于这个表”,即使循环内有新行
- algorithm - 插入排序消耗多少堆栈帧?
- javascript - 有没有办法使用 DiscordJs 以消息的第一个字母对不和谐消息作出反应
- python - 如何解决 Python tkinter 程序中的“名称错误”?
- onclick - 我可以单击 2 个不同的棋子并让它们在具有相同交互事件的同时打印不同的东西吗?
- github - Github:无法上传文件夹中的文件,但可以将其上传到主存储库
- pyspark - Pyspark - 希望将 SQL 查询应用于 pyspark 数据帧
- swift - 可能没有解决方案的奇怪的 Swift TextField 故障?
- macos - 在 macOS Catalina 上安装 brew
- javascript - 为什么 Here Maps JS 事件在加载到 .NET WebBrowser 控件时停止触发?