更通用的 Expand.grid 函数?

Spa*_*man 5 r

Expand.grid(a,b,c) 生成矩阵中 a、b 和 c 中的值的所有组合 - 本质上填充三维立方体的体积。我想要的是一种从以立方体为中心的立方体(或更高维结构)中获取切片或线的方法。

因此,假设 a、b、c 都是奇数长度向量(因此它们有一个中心),在这种情况下,假设它们的长度为 5。我假设的 slice.grid 函数:

slice.grid(a,b,c,dimension=1)
Run Code Online (Sandbox Code Playgroud)

返回沿三个中心线的点的坐标矩阵。几乎相当于:

rbind(expand.grid(a[3],b,c[3]),
      expand.grid(a,b[3],c[3]),
      expand.grid(a[3],b[3],c))
Run Code Online (Sandbox Code Playgroud)

几乎,因为它的中心点重复了三次。此外:

slice.grid(a,b,c,dimension=2)
Run Code Online (Sandbox Code Playgroud)

应返回一个等价于的矩阵:

rbind(expand.grid(a,b,c[3]), expand.grid(a,b[3],c), expand.grid(a[3],b,c))
Run Code Online (Sandbox Code Playgroud)

这是三个相交的轴对齐平面(矩阵中的交叉点有重复的点)。

进而:

slice.grid(a,b,c,dimension=3)
Run Code Online (Sandbox Code Playgroud)

与 Expand.grid(a,b,c) 相同。

对于三个参数来说这还不错,但理想情况下我想用传递给函数 Expand.grid(a,b,c,d,e,f,dimension=4) 的 N 个参数来做到这一点 - 这不太可能但我希望维度大于 3。

可以通过执行 Expand.grid 然后提取所需的点来完成,但我不确定如何构建该标准。而且我总有一种感觉,这个函数存在于某个包中的某个地方......

[编辑] 是的,我想我现在已经弄清楚了标准 - 它与中心值在每行中出现的次数有关。如果它小于或等于你的维度+1...

但是生成完整的矩阵很快就会变大。暂时就这样吧

G. *_*eck 1

假设abc每个变量的长度都是 3(如果有 4 个变量,那么它们每个变量的长度都是 4 等等),试试这个。它的工作原理是使用 1:3 代替每个ab然后c计算每行中有多少个 3。如果有四个变量,那么它使用 1:4 并计算每行中有多少个 4,等等。它使用它作为索引来从 中选择适当的行expand.grid(a, b, c)

slice.expand <- function(..., dimension = 1) {
    L <- lapply(list(...), seq_along)
        n <- length(L)
    ix <- rowSums(do.call(expand.grid, L) == n) >= (n-dimension)
    expand.grid(...)[ix, ]
}

# test
a <- b <- c <- LETTERS[1:3]
slice.expand(a, b, c, dimension = 1)
slice.expand(a, b, c, dimension = 2)
slice.expand(a, b, c, dimension = 3)
Run Code Online (Sandbox Code Playgroud)